这种写法类似于布尔值强转,如图可将undefined转为false
闭包。
闭包经典使用场景
闭包还有个相当经典的场景,它在面试中经常会被提及,那就是for循环中的函数。
var arr = [];
for(var i = 0; i< 5; i++){
arr[i] = function(){
return i;
}
}
arr[0](); // 5
在这个问题中,i 这个变量是被共享的。当循环结束之后,i 已经变成5了。所以arr0输出的是5。要解决问题,需要在定义arr[i]的匿名函数时,就需要记住 i 的值,而不能让它一直是变动的。用闭包的思路是让i在每次迭代的时候,都产生一个私有的作用域,在这个私有的作用域中保存当前i的值,每个作用域的i是独立不影响的,也就避免了共用 i,而 i 到最后都是5的问题。代码如下。
var arr = [];
for(var i = 0; i< 5; i++){
arr[i] = (function(i){
return function(){
return i;
}
})(i)
}
arr[0](); // 0
终极解决方案,这是 ES6 中的知识,因为之前在 JS 中是没有块级作用域的概念的,到了 ES6 中就有了,Let 声明的变量就可以更好的解决上述问题。
var arr = [];
for (let i = 0; i < 5; i++) {
arr[i] = function () {
return i;
};
}
arr[0](); // 0