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能取得同样的效果对比清楚,两者都是创建新作用域只不过,一个是利用的旧语法创建新函数,另外一个是使用了新的语法不用创建新函数。


相关文章
|
5月前
|
数据库连接 程序员 C#
聊聊 C# 中 using 语句可能的 3 个陷阱
大家都知道,C# 中可以用 using 关键字来简化非托管资源(如文件流、数据库连接等)的释放,但是如果用在错误的使用场景,可能会带来一些意想不到又难以排查的问题,来看看有哪些可能的陷阱吧!
149 7
聊聊 C# 中 using 语句可能的 3 个陷阱
|
8月前
|
存储 Java
JavaSE——流程控制-循环结构(for循环、while循环、小案例、do-while循环、死循环、循环嵌套)
JavaSE——流程控制-循环结构(for循环、while循环、小案例、do-while循环、死循环、循环嵌套)
44 0
|
4月前
|
Serverless C语言
C语言控制语句:分支、循环和转向
C语言控制语句:分支、循环和转向
|
9月前
|
C语言
C语言中如何避免循环死循环
C语言中如何避免循环死循环
379 1
|
9月前
|
算法 程序员 C++
C++程序中的循环结构:控制程序重复执行的关键
C++程序中的循环结构:控制程序重复执行的关键
188 2
|
9月前
|
存储 编译器 程序员
C陷阱——数组越界引发的死循环问题
C陷阱——数组越界引发的死循环问题
|
9月前
|
存储 编译器 C语言
C陷阱:数组越界遍历,不报错却出现死循环?从内存解析角度看数组与局部变量之“爱恨纠葛”
在代码练习中,通常会避免数组越界访问,但如果运行了这样的代码,可能会导致未定义行为,例如死循环。当循环遍历数组时,如果下标超出数组长度,程序可能会持续停留在循环体内。这种情况的发生与数组和局部变量(如循环变量)在内存中的布局有关。在某些编译器和环境下,数组和局部变量可能在栈上相邻存储,数组越界访问可能会修改到循环变量的值,导致循环条件始终满足,从而形成死循环。理解这种情况有助于我们更好地理解和预防这类编程错误。
182 0
|
C语言 C++
C语言循环和判断的学习
从简单循环到复杂循环
137 3
C语言循环和判断的学习
|
Go
说说Go语言for循环中的继续、中断、跳出
说说Go语言for循环中的继续、中断、跳出
187 0
|
Python
while循环的妙用
while循环的妙用
99 1