函数

作者: ahong_吴 | 来源:发表于2016-09-16 15:24 被阅读22次

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

    函数声明:

    function functionName(){
      statement;
    }
    

    函数表达式:

    var printName = function(){
        console.log('Byron');
    };
    

    区别:在于函数声明前置的不同,函数声明是整个函数前置。函数表达式是是所代表的变量前置。

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

    变量声明前置:把var xxx(变量名称)提升到代码的顶端,但是其赋值不会提升。
    函数的声明前置:把函数的位置提升,函数表达式会提升该函数所赋值的变量。

    下载.png

    三、arguments 是什么

    是函数执行时传递进来的参数。
    参数的顺序与命名无关,与传递进来的顺序有关。

    function getString(a,b){
    console.log(a+b)
    console.log(arguments);
    }
    getString(1,2,"c");
    

    四、函数的重载怎样实现

    在JavaScript中没有函数重载的概念,只要函数名是一样的,后面的就会覆盖前面的。

    function sum(x){
    console.log(x+1);
     }
     function sum(x){
     console.log(x+2);
     }
    
     sum(1);//结果为3;后面覆盖前面。
    

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

    (function example( ){
     console.log(a)
     })( );
    

    作用:可以让函数在定义后直接调用,在固有的作用域内使用,不会污染全局变量。立即执行函数里面的变量外面是取不到的。

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

    var A;//全局作用域
    function B()
    {
        var C;//C位于B函数的作用域
        function D()
        {
            var E;//E位于D函数的作用域
            alert(A)
        }
    }
    

    javaScript中所有的量都是存在于某一个作用域中,最大的作用域为全局作用域,任何子作用域都能引用全局作用域中的变量。还有局部作用域,它存在于函数内部,在那个函数的外部无法引用它。

    本作用域找不到的变量,就会往上父作用域去寻找,如果仍旧找不到,就会往更上层寻找,直至到windom环境,这就形成了链。

    代码

    1.以下代码输出什么?

    Paste_Image.png

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

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

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

    console.log(a);//undefined
     var a = 1;
     console.log(b);//b is not defined
    

    因为:

    var a;           //变量声明被前置,而赋值却没有。
    console.log(a); 
    a = 1; 
    console.log(b);//b连声明都没有
    

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

    sayName('world');
        sayAge(10);
        function sayName(name){
            console.log('hello ', name);
        }
        var sayAge = function(age){
            console.log(age);
        };
    // hello  world
    // Uncaught TypeError: sayAge is not a function(…)
    // 函数声明使函数被提前;而函数表达式只有函数名所代表的变量提前.
    

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

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

    因为:

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

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

    Paste_Image.png
    function fn(fn2){
        var fn2;//变量声明提升
       function fn2(){
            console.log('fnnn2');
        }//函数声明提升
        console.log(fn2);
    
        fn2 = 3;
    
        console.log(fn2);
        console.log(fn);  
    } 
    fn(10);
    

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

    var fn;  //先声明变量fn
    function fn(fn){ 
    console.log(fn);
     }   //再声明函数,函数的声明会覆盖变量的声明
    fn = 1;  //然后给fn赋值为1,会覆盖上面的方法声明,此时fn为数字1
    console.log(fn(fn));  //这里是调用函数fn,但是此时fn是数字1,不能当作函数来调用,所以会报错
    
    

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

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

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

    var i;
        var fn;
        function fn(){
            var i;
            function fn2(){
                i = 100;
            }
            console.log(i);//输出undefined,因为i声明了还没有赋值
            i = 99;
            fn2();//执行后i为100
            console.log(i);//输出100
        }
        fn();
        i = 10;
        fn = 20;
        console.log(i);//输出10
    

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

    var say;
    (function say(n){
       console.log(n);      //参数是10
      if (n<3) {return;}    2
        say(n-1);      //一直-1,知道小于3,也就是到2为止。 9,8,7,6,5,4,3,2
     }(10));
     say = 0;
     console.log(say);   // 0 say变量赋值的是0```

    相关文章

      网友评论

          本文标题:函数

          本文链接:https://www.haomeiwen.com/subject/smjbettx.html