something about JavaScript(2)

2017-07-10  本文已影响18人  来人啊都给朕退下吧

函数声明和函数表达式有什么区别

函数声明

 //函数声明
  function sayHello(){
    console.log('hello')
  }

  //函数调用
  sayHello()

声明不必放到调用的前面

函数表达式

 var sayHello = function(){
    console.log('hello');
  }

  sayHello()
  

声明必须放到调用的前面

什么是变量的声明前置?什么是函数的声明前置?

声明前置是将变量、函数的声明放此变量、函数所在作用域的开头部分。

arguments 是什么

arguments是一个类数组对象。代表传给一个function的参数列表。
可以在函数内部通过使用 arguments 对象来获取函数的所有参数。这个对象为传递给函数的每个参数建立一个条目,条目的索引号从0开始。它包括了函所要调用的参数。object对象。类数组。

function printInfo( name, age, sex ){
    console.log( name );
    console.log( age );
    console.log( sex );
    console.log( arguments[0] );    // 打出来的是name
}

函数的"重载"怎样实现

首先,要明确,在JS中,没有重载。同名函数会覆盖。但可以在函数体针对不同的参数调用执行相应的逻辑。
 
 function printPeopleInfo(name, age, sex){
    if(name){
      console.log(name);
    }
    if(age){
      console.log(age);
    }
    if(sex){
      console.log(sex);
    }
  }
  printPeopleInfo('Byron', 26);//Byron 26
  printPeopleInfo('Byron', 26, 'male');//Byron 26 male  
  
  

立即执行函数表达式是什么?有什么作用

(function fn1(){
    var  a = 1;
})()

作用: 隔离作用域。

JavaScript有很多致命缺陷,比如JavaScript中没有命名空间,而且只有function代码块内部可以隔离变量作用域,自调用匿名函数就用来防止变量弥散到全局,以免各种js库冲突。

求n!,用递归来实现

function mul(a) {

    if (a < 0)
        return;
    if (a == 0)
        return 1; 
    {
        return a * mul(a - 1);
    }
}

console.log(mul(5));

//输出结果120

一些面试题

如下代码的输出?为什么

        function getInfo(name, age, sex){
        console.log('name:',name);
        console.log('age:', age);
        console.log('sex:', sex);
        console.log(arguments);
        arguments[0] = 'valley';
        console.log('name', name);
    }

    getInfo('饥人谷', 2, '男');
    getInfo('小谷', 3);
    getInfo('男');
    
    
    
执行结果:
getInfo('饥人谷', 2, '男');
输出: 
name:  饥人谷
age: 2
sex: 男
{0:'valley', 1: 2, 2: '男'}
name  valley 


getInfo('小谷', 3);
输出: 
name: 小谷
age: 3
sex: undefined
{0:'valley', 1: 3}
name  valley 


getInfo('男');
输出: 
name: 男
age: undefined
sex: undefined
{0:'valley'}
name  valley 


写一个函数,返回参数的平方和?

  function sumOfSquares() {

      var sum = 0;

      for (var i = 0; i < arguments.length; i++) 
      {
          sum += Math.pow(arguments[i], 2);
          
      }
      
      return sum;
  }
   var result = sumOfSquares(2,3,4)
   var result2 = sumOfSquares(1,3)
   console.log(result)  //29
   console.log(result2)  //10

如下代码的输出?为什么

    console.log(a);
    var a = 1;
    console.log(b);
    
    
输出结果:undefined
    
        Uncaught ReferenceError: b is not defined
            
 解析:console.log(a)的时候虽然a声明前置,但是并未赋值,所以这时候a的值是undefined,console.log(b)的时候,b没有定义,所以是报错。
    
    

如下代码的输出?为什么

    sayName('world');//hello world  函数声明前置,可以随意调用
    sayAge(10);//报错,因为此函数必须必须在其函数表达式之后调用
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    }
    ;
    

如下代码输出什么? 写出作用域链查找过程伪代码

var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}

输出结果:10

调用过程:
////
1. globalContext = {

    AO: {

        x: 10;
        foo:function
        bar:function
    }

    foo.[[scope]] = globalContext.AO
    bar.[[scope]] = globalContext.AO

}

2.调用bar()  barContext = {

    AO:{

        x:30;

    }
    scope:bar.[[scope]] = globalContext.AO
}


3.调用foo() fooContext = {

    AO:{}

    scope:foo.[[]scope] =globalContext.AO


}


如下代码输出什么? 写出作用域链查找过程伪代码

var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}   


运行结果:30

调用过程

////////////

1. globalContext = {

    AO: {
        x: 10;
        bar:function
    }

  
    bar.[[scope]] = globalContext.AO

}

2.调用bar()  barContext = {

    AO:{

        x:30;
        foo:function

    }
    scope:bar.[[scope]] = globalContext.AO
    scope:foo.[[scope]] = barContext.AO
}


3.调用foo() fooContext = {

    AO:{}

    scope:foo.[[]scope] =barContext.AO


}

以下代码输出什么? 写出作用域链的查找过程伪代码

 
var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
}


输出结果:30



调用过程:

//////


1. globalContext = {

    AO: {
        x: 10;
        bar:function
    }

  
    bar.[[scope]] = globalContext.AO

}

2.调用bar()  barContext = {

    AO:{

        x:30;
        匿名:function

    }
    scope:bar.[[scope]] = globalContext.AO
    scope:匿名.[[scope]] = barContext.AO
}


3.调用匿名函数()   匿名Context = {

    AO:{}

    scope:匿名函数.[[scope]] =barContext.AO


}




以下代码输出什么? 写出作用域链查找过程伪代码

var a = 1;

function fn(){
  console.log(a)
  var a = 5
  console.log(a)
  a++
  var a
  fn3()
  fn2()
  console.log(a)

  function fn2(){
    console.log(a)
    a = 20
  }
}

function fn3(){
  console.log(a)
  a = 200
}

fn()
console.log(a)


输出结果: undefined 5 1 6 20 200


调用过程:
///////
1. globalContext {

    AO: {
        a: 200;
        fn: function
        fn3: function

    }

    Scope: null;

   fn.[[scope]]=globalContext.AO
   fn3.[[scope]]=globalContext.AO


}

2. 调用fn() 

    fnContext{
      AO:{
        a:20
        fn2:function
      }

      fn.[[scope]]=globalContext.AO
      fn2.[[scope]]=fnContext.AO

    }

3. 调用fn3()

      fn3Context{
        AO:{}
        fn3.[[scope]]=globalContext.AO
      }

4. 调用fn2()

      fn2Context{
        AO:{}
        fn2.[[scope]]=fnContext.AO

      }



上一篇下一篇

猜你喜欢

热点阅读