函数

作者: 王康_Wang | 来源:发表于2016-07-26 09:01 被阅读0次

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

    • 在变量提升或声明提前过程中,函数声明是将整个被定义的函数提前,即该函数可以在任意位置被调用;
      而函数表达式的变量提升则是将函数名作为一个普通参数提前,此时并没有被赋予函数属性,所以只有在被函数表达式赋值后才能调用该函数。、

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

    • 变量的声明前置是指将所声明的变量提升,即表示存在该变量,但此时并没有给这个变量赋值;
      函数的声明前置是指将整个被定义的函数提升,此时这个函数是有意义的,可以被调用的。

    3. arguments是什么?

    • arguments的作用是获取函数中的参数并形成一个类数组对象。

    4. 函数的重载怎样实现?

    • 通过arguments来实现函数对象数目的变化。

    举例:

    •   function getInfo(name, age, sex){
            console.log('name:',name);      //  输出'name:'+name的赋值
            console.log('age:', age);       //  输出'age:'+ age的赋值
            console.log('sex:', sex);       //  输出'sex:'+ sex的赋值
            console.log(arguments);         //  获取参数,形成一个类数组对象
            arguments[0] = 'valley';        //  为数组中第一个参数即'name'重新赋值
            console.log('name', name);      //  输出'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);   // 29
        sumOfSquares(1,3);   // 10
    

    代码如下:

    •   function sumOfSquares(){
            var sum = 0;
            for (var i = 0; i < arguments.length; i++) {
                sum += arguments[i]*arguments[i];
            };
            console.log (sum);
        }
        sumOfSquares(2,3,4);   // 29
        sumOfSquares(1,3);   // 10
      
    [代码地址](http://book.jirengu.com/jirengu-inc/jrg-vip9/members/%E7%8E%8B%E5%BA%B7/%E4%BB%BB%E5%8A%A1%E5%8D%81%E4%B8%83%EF%BC%9A%E5%87%BD%E6%95%B0/task17-2.html)
    
    ###3. 如下代码的输出?为什么?
    - ```
        console.log(a);     // undefined
        var a = 1;
        console.log(b);     // Uncaught ReferenceError: b is not defined
    
    • 由于变量提升,且变量a的赋值在语句console.log(a)之后,故console.log(a)输出为undefined
      因为b为被定义,故浏览器报错。

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

    •   sayName('world');   // hello world
        sayAge(10);         // Uncaught TypeError: sayAge is not a function
        function sayName(name){
            console.log('hello ', name);
        }
        var sayAge = function(age){
            console.log(age);
        };
      
    - 函数声明提升是把整个被定义的函数提升,故第一行```sayName('world'); ```执行时函数```sayName()```可被调用;
    但函数表达式的声明提前只是把函数名作为一个普通变量提升,故```sayAge(10);```执行时```sayAge```只是一个普通变量,故将其作为函数调用会使浏览器报错。
    
    ###5. 如下代码的输出?为什么?
    - ```
        function fn(){}
        var fn = 3;
        console.log(fn);    // 3
    
    • 变量提升或声明提前后按照执行顺序代码如下:
    •   function fn(){}
        var 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);
        // fn2(){
        //         console.log('fnnn2');
        //     }
        // 3
        // fn(fn2){
        //    console.log(fn2);
        //    var fn2 = 3;
        //    console.log(fn2);
        //    console.log(fn);
        //    function fn2(){
        //         console.log('fnnn2');
        //     }
        //  }
    

    函数fn()根据声明提前等规则可以变换为:

    •   function fn(fn2){
            var fn2;
            function fn2(){
                console.log('fnnn2');
            }
           console.log(fn2);        // 语句1
           fn2 = 3;
           console.log(fn2);        // 语句2
           console.log(fn);         // 语句3
         }
        fn(10);
      
    所以语句1输出为函数```fn2()```,语句2执行时```fn2=3```,故输出3,语句3输出函数```fn(fn2)```。
    
    ###7. 如下代码的输出?为什么?
    - ```
        var fn = 1;
        function fn(fn){
            console.log(fn);
        }
        console.log(fn(fn));    // Uncaught TypeError: fn is not a function
    

    按照变量提升或声明提前可变换为:

    •   var fn ;
        function fn(fn){
            console.log(fn);
        }
        fn = 1;
        console.log(fn(fn));
      
    所以在执行```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);
        console.log(i);
        for(i=0; i<10; i++){
            j = 100;
        }
        console.log(i);
        console.log(j);
      
    当```for```循环之后,```i```的值为10,```j=100```,所以最后的```console.log(i);```输出为10,```console.log(j);```输出为100.
    
    ###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();
        i = 10;
        fn = 20;
        console.log(i);
        // undefined
        // 100
        // 10
      
    
    ###10. 如下代码的输出?为什么?
    - ```
        var say = 0;
        (function say(n){
            console.log(n);     // 10 9 8 7 6 5 4 3 2
            if(n<3) return;
            say(n-1);
        }( 10 ));
        console.log(say);       // 0
    

    变量提升或声明提前后,代码变为:

    •   var say;
        function say(n){
            console.log(n);     
            if(n<3) return;
            say(n-1);
        };
        say = 0;
        (function say(n){
            console.log(n);     
            if(n<3) return;
            say(n-1);
        }( 10 ));
        console.log(say);
      
    立即调用函数使得```say()```在被调用时不会被```say = 0```覆盖,同时也不会影响全局变量```say = 0```。
    
    ***
    此教程版权归本人和饥人谷所有,转载需注明来源。

    相关文章

      网友评论

          本文标题:函数

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