Day15 - let为什么可以解决循环陷阱

简介: Day15 - let为什么可以解决循环陷阱

什么是循环陷阱


var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10


  • 由于匿名函数中使用的变量 i 在作用域外声明形成闭包


  • i 属于全局作用域


  • 所以循环中创建的匿名函数都指向同一个变量


所谓循环陷阱就是看似每个新创建的函数都需要一个单独的变量,但是没有实现,所以叫做循环陷阱


IIFE即时执行函数解决


var a = [];
for (var i = 0; i < 10; i++) {
  (function(n) {
    a[i] = function () {
    console.log(n);
  };
  })(i)
}
a[6](); // 10


解决此问题的方法就是创建一个新的作用域。


由于es6之前只能使用函数作用域,唯一的办法就是创建新的函数。所以就采用创建一个即时函数的方式创建新作用域。


网络异常,图片无法展示
|


let创建块级作用域解决


var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6


网络异常,图片无法展示
|


面试攻略


这道题的解题关键是如何将ES5的IIFE和ES6的let能取得同样的效果对比清楚,两者都是创建新作用域只不过,一个是利用的旧语法创建新函数,另外一个是使用了新的语法不用创建新函数。


相关文章
|
1月前
|
C语言
20.C语言:用continue语句提前终止循环
20.C语言:用continue语句提前终止循环
14 0
|
6月前
|
Go
说说Go语言for循环中的继续、中断、跳出
说说Go语言for循环中的继续、中断、跳出
43 0
|
7月前
|
Web App开发 存储
用9种办法解决 for 循环取 i
用9种办法解决 for 循环取 i
41 0
|
9月前
|
编译器 C语言 C++
数组越界访问打印后为什么会陷入死循环
数组越界访问打印后为什么会陷入死循环
71 0
|
10月前
|
编译器 C语言 C++
C语言数组越界造成的死循环例子,当你得到了这个意想不到的结果的时候,你肯定不知道为什么,看你还敢不敢越界访问数组了
C语言数组越界造成的死循环例子,当你得到了这个意想不到的结果的时候,你肯定不知道为什么,看你还敢不敢越界访问数组了
|
11月前
|
编译器 C语言
《C陷阱与缺陷》之“语义”陷阱——数组越界导致的程序死循环问题
《C陷阱与缺陷》之“语义”陷阱——数组越界导致的程序死循环问题
88 0
04【C语言 & 趣味算法】“抓交通肇事犯”问题。算法改进:设置“标识变量”,有效减少循环次数。
04【C语言 & 趣味算法】“抓交通肇事犯”问题。算法改进:设置“标识变量”,有效减少循环次数。
04【C语言 & 趣味算法】“抓交通肇事犯”问题。算法改进:设置“标识变量”,有效减少循环次数。
|
Shell
shell编程——5个双重循环实验(带你玩转双重循环)
实验1 实验要求:将一个点分十进制格式的IP地址转换成点分二进制格式。 创建脚本:
113 0
|
C语言
初识C语言之循环控制篇——带你探索编程世界无限循环!
初识C语言之循环控制篇——带你探索编程世界无限循环!
162 0
初识C语言之循环控制篇——带你探索编程世界无限循环!
|
C++
C++学习005-循环
C++在循环方面,感觉个C没有身边么区别
67 0