2022-1-6(!!布尔值强转,闭包)

67 阅读1分钟

image.png

这种写法类似于布尔值强转,如图可将undefined转为false

image.png

闭包。

image.png

闭包经典使用场景

闭包还有个相当经典的场景,它在面试中经常会被提及,那就是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 = 0i5i++){
      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