js函数

2016-08-05  本文已影响0人  __Qiao

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

等价于

  function getsum(num1, num2){
      return num1+num2;
  }
  getsum(1, 2);    //3

等价于

  var getsum;
  getsum(1, 2);    ////Uncaught TypeError: getsum is not a function
  getsum = function(num1, num2){
      return num1+num2;
  };

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

下面这个例子也是输出undefined,因为输出的是main()内的局部变量
var a = 1;
function main(){
console.log(a);
var a = 2;
}
main(); //undefined
等价于

  var a;
  function main(){
      var a;
      console.log(a);
      a = 2;
  }
  a = 1;
  main();    //undefined

等价于

  var num1, num2;
  function getsum(num1, num2){
      return num1 + num2;
  }
  num1 = 1;
  num2 = 2;
  getsum(num1, num2);    //3

三、arguments是什么?

arguments是一个用于存放函数所有传入参数的类数组对象。

  function main(a, b, c){
      return arguments;
  }
  main(1, 2, 3);      //[1, 2, 3]

arguments的值由函数的传入参数决定,与函数定义的参数无关

四、函数的重载怎样实现?

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

上面代码中,写法二比写法一更好,因为完全避免了污染全局变量

六、什么是函数的作用域链

代码

1.以下代码输出什么?

    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('hunger', 28, '男');  
    //name: hunger 
    //age: 28 
    //sex: 男
    //["hunger",28,"男"] 
    //name: valley
    getInfo('hunger', 28);  
    //name: hunger 
    //age: 28 
    //sex: undefined 
    //["hunger",28] 
    //name: valley
    getInfo('男');  
    //name: 男 
    //age: undefined 
    //sex: undefined 
    //["男"] 
    //name: valley

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

    function sumOfSquares(){}
    sumOfSquares(2,3,4);
    sumOfSquares(1,3);

    function sumOfSquares(num1, num2){
        var sum = 0;
        for(var i = 0; i < arguments.length; i++){
            var a = arguments[i];
            sum += a*a;
        }
        return sum;
    }
    console.log(sumOfSquares(2,3,4)); // 29
    console.log(sumOfSquares(1,3));  // 10

3.如下代码的输出?为什么

    console.log(a);  // undefined,变量声明提升
    var a = 1;
    console.log(b);  // 报错,因为变量b没有声明

等价于

    var a;
    console.log(a);  // undefined
    a = 1;
    console.log(b);  // 报错,因为变量b没有声明

4.如下代码的输出?为什么

    sayName('world');  // hello world
    sayAge(10);  // 报错,因为函数表达式不会前置,执行到这里时sayAge没有指向任何函数
    function sayName(name){
        console.log('hello', name);
    }
    var sayAge = function(age){
        console.log(age);
    }

等价于

    var sayAge;
    function sayName(name){
        console.log('hello', name);
    }
    sayName('world');  // hello world
    sayAge(10);  // 报错,执行到这里时sayAge没有指向任何函数
    sayAge = function(age){
        console.log(age);
    }

5.如下代码的输出?为什么

    function fn(){}
    var fn = 3;
    console.log(fn);  // 3

等价于

    var fn;
    function fn(){}
    fn = 3;
    console.log(fn);  // 3

6.如下代码的输出?为什么

    function fn(fn2){
        console.log(fn2);
        var fn2 = 3;
        console.log(fn2);
        console.log(fn);
        function fn2(){
            console.log('fnnn2');
        }
    }
    fn(10);
    // function
    // 3
   // function

等价于

    function fn(fn2){
        var fn2;
        function fn2(){
            console.log('fnnn2');
        }
        console.log(fn2);  
        fn2 = 3;
        console.log(fn2);  
        console.log(fn);  
    }
    fn(10);
    // function 
    // 3
   // function

7.如下代码输出什么?为什么

    var fn = 1;
    function fn(fn){
        console.log(fn);
    }
    console.log(fn(fn));  // 报错,这里变量fn存放的是一个数值,没有指向函数

等价于

    var fn
    function fn(fn){
        console.log(fn);
    }
    fn = 1;
    console.log(fn(fn));  // 报错,这里变量fn存放的是一个数值,没有指向函数

8.如下代码的输出?为什么

    console.log(j);  // undefined
    console.log(i);  // undefined
    for(var i=0; i<10; i++){
        var j = 100;
    }
    console.log(i);  // 10
    console.log(j);  // 100

等价于

    var i;
    var j;
    console.log(j);  // undefined
    console.log(i);  // undefined
    for(i=0; i<10; i++){
        j = 100;
    }
    console.log(i);  // 10
    console.log(j);  // 100

变量i,j都是全局变量,只有在函数内才会存在局部变量

9.如下代码的输出?为什么

    fn();
    var i = 10;
    var fn = 20;
    console.log(i);
    function fn(){
        console.log(i);
        var i = 99;
        fn2();
        console.log(i);
        function fn2(){
            i = 100;
        }
    }

等价于

    var i;
    var fn;
    function fn(){
        var i;
        function fn2(){
            i = 100;
        }
        console.log(i);
        i = 99;
        fn2();
        console.log(i);
    }
    fn(); 
    /**
     * console.log(i);  // undefined 
     * fn2();  // 没有输出
     * console.log(i);  // 100
     */
    i = 10;
    fn = 20;
    console.log(i);  // 10

10.如下代码的输出?为什么

    var say = 0;
    (function say(n){
        console.log(n);
        if(n<3) return;
        say(n-1);
    }(10));
    /**
     *立即执行函数表达式,传入参数为10,即n=10
     *console.log(n);  // 10
     *if(n<3) return;  //n<3时跳出循环
     *say(n-1);  // 9 8 7 6 5 4 3 2
     */
    console.log(say);  // 0, 这里的say是全局变量say,立即执行函数表达式中的say是局部变量

本文版权属吴天乔所有,转载务必注明出处。

上一篇 下一篇

猜你喜欢

热点阅读