1.什么是闭包?
是说函数变量可以被隐藏于作用域链之内,看起来像是函数将变量包裹了起来;
先来看两个例子:
var scope = "global";
function checkscope(){
var scope = "local";
function f(){
return scope;
}
return f();
}
checkscope() // "local"
根据作用域链的相关知识,上面的输出结果不难理解,再看一下变体
var scope = "global";
function checkscope(){
var scope = "local";
function f(){
return scope;
}
return f;
}
checkscope()() // "global"
输出结果是不是匪夷所思,闭包也太强大了,但是我还有没有搞清楚什么时候使用他
2.闭包的作用?
闭包可以捕捉到局部变量和参数,并且将它一直保存下来(闭包的特性);闭包可以捕捉到单个函数调用的局部变量,并将这些局部变量用作私有状态。
3.闭包的坏处?
容易造成内存泄漏
4.面试题
for(var i=0;i <=5;i++){
setTimeout(function timer(){
console.log(i)
},1000);
}
问:以上代码是否能依次返回0 1 2 3 4 5,如果不能请修改代码?
上述代码的返回值是6,且每1000毫秒返回一个6;
for(var i=0;i <=5;i++){
(function (i){
setTimeout(function timer(){
console.log(i)
},1000)})(i);
}
其次,ES6中的let关键字可以实现块级作用域
for (let i = 1; i <= 5; i++) {
setTimeout( function timer() {
console.log(i);
}, 1000 );
}
网友评论