JS函数

作者: 0ec02b597a36 | 来源:发表于2016-05-13 11:30 被阅读71次
    • 函数声明和函数表达式有什么区别 (*)

    函数声明:function bar() {}
    函数表达式:var fuc = foo(){}
    1.函数bar将会在整个程序执行前被 hoist(提升),因此它在定bar函数的整个scope (作用域)中都是可用的。即使在函数定义之前调用它也没问题。
    2.对于函数声明,函数的名称是必须的,而对于函数表达式而言则是可选的,因此,就出现了匿名函数表达式和命名函数表达式。
    3在这个函数里
    var foo = function bar() {
    bar(); // Works};
    bar(); // ReferenceError命名函数bar赋值给了变量foo,所以在函数声明外是不可见的,但在bar`函数内部仍然可以调用。这是因为Javascript对命名函数处理的机制,函数的名称永远在函数内部的作用域中有效。

    • 什么是变量的声明前置?什么是函数的声明前置 (**)

    所谓的变量声明前置就是在一个作用域块中,所有的变量都被放在块的开始出声明。下面通过三段代码举例:
    代码1:
    var a = 1;
    function main() {
    console.log(a);//1
    }
    main();//输出1`
    代码2:
    1 var a = 1;
    2 function main() {
    3 console.log(a);
    4 var a = 2;
    5 }
    6 main()//输出undefined
    代码3:为什么代码2会输出undefined
    1 var a = 1;
    2 function main() {
    3 var a;
    4 console.log(a);
    5 a = 2;
    6 }
    函数的声明前置就是把整个函数提升到当前作用域的最前面(位于前置的变量声明后面)。
    var num = 1;
    console.log(doubleNum(num));//2
    function doubleNum(num){ return num2;}
    等价于
    //函数的声明前置
    var num;
    function doubleNum(num){ return num
    2;}
    num = 1;
    console.log(doubleNum(num));//2

    • arguments 是什么 (*)

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

    • 函数的重载怎样实现 (**)

    可以通过arguments的length和参数的类型来实现。例:
    function sumOfSquares(a, b, c){
    if(arguments.length<3){
    c = 0;
    }
    return aa+bb+c*c
    }
    sumOfSquares(2,3,4); // 29
    sumOfSquares(1,3); // 10

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

    立即执行函数通常有下面两种写法:
    (function(){...})();
    (function(){ ...}());//推荐使用
    在Javascript中,一对圆括号“()”是一种运算符,跟在函数名之后,表示调用该函数。
    参考-JavaScript中的立即执行函数

    • 什么是函数的作用域链 (****)

    作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。
    作用域链是当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain,不简称sc)来保证对执行环境有权访问的变量和函数的有序访问。作用域第一个对象始终是当前执行代码所在环境的变量对象(VO)

    相关文章

      网友评论

        本文标题:JS函数

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