1

1.简答题:什么是闭包,闭包有什么用?请举例说明。

闭包:这个术语非常古老,是指函数变量可以被隐藏于作用域链之内,因此看起来是函数将变量“包裹”起来了。

定义大多数函数时的作用域链在调用函数时依然有效,但这并不影响闭包。当调用函数时闭包所指向的作用域链,和定义函数时的作用域链不是同一个作用域链时,事情就变得非常微妙。当一个函数嵌套另一个函数,外部函数将嵌套的函数对象作为返回值返回的时候往往会发生这种事情。

function f1(){
    var n=1024;
    function f2(){
        console.log(n)
    }
    return f2;
}   
var foo =f1();
foo();    //1024
//以上函数f2()就是闭包

闭包就是能够读取其他函数内部变量的函数。

2.填空题:apply 和 call 的用法和区别。

两者的作用都是将函数绑定到另外一个对象上面去,两者仅仅在定义参数方式有所区别。

MDN:NOTE: While the syntax of this function is almost identical
to that of apply(), the fundamental difference is that call() accepts
an argument list, while apply() accepts a single array of arguments.

apply(thisArg,argArray);    //多个参数合并在一个数组
call(thisArg[,arg1,arg2…] ]);    //多个参数分开传

3.bind 函数的兼容性

bind方法会创建一个新函数,称为绑定函数。当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.

fun.bind(thisArg[, arg1[, arg2[, ...]]])

4.callee和caller属性
在ECMAScript 5严格模式种,对这两个属性的读写操作都会产生一个类型错误。
而在非严格模式下,ECMAScript标准规范规定

callee属性指代当前正在执行的函数

caller是非标准的,但大多数浏览器都实现了这个属性,它

指代调用当前正在执行函数的函数

通过caller属性可以访问调用栈。callee属性在某些时候会非常有用,比如在匿名函数中通过callee来递归调用自身。

var factorial = function(x) {
    if(x <= 1) { return 1;}
    return x * arguments.callee(x-1);
};

Doyle
844 声望16 粉丝

前端, angular, vue


引用和评论

0 条评论