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


相关文章
|
3月前
|
JavaScript 前端开发 Java
for 循环学习
【10月更文挑战第4天】
107 5
|
7月前
|
存储 Java
JavaSE——流程控制-循环结构(for循环、while循环、小案例、do-while循环、死循环、循环嵌套)
JavaSE——流程控制-循环结构(for循环、while循环、小案例、do-while循环、死循环、循环嵌套)
42 0
|
5月前
|
存储 安全 编译器
指针的深入理解与陷阱
指针的深入理解与陷阱
73 0
|
8月前
|
C语言
C语言中如何避免循环死循环
C语言中如何避免循环死循环
367 1
|
8月前
|
存储 编译器 程序员
C陷阱——数组越界引发的死循环问题
C陷阱——数组越界引发的死循环问题
|
8月前
|
存储 编译器 C语言
C陷阱:数组越界遍历,不报错却出现死循环?从内存解析角度看数组与局部变量之“爱恨纠葛”
在代码练习中,通常会避免数组越界访问,但如果运行了这样的代码,可能会导致未定义行为,例如死循环。当循环遍历数组时,如果下标超出数组长度,程序可能会持续停留在循环体内。这种情况的发生与数组和局部变量(如循环变量)在内存中的布局有关。在某些编译器和环境下,数组和局部变量可能在栈上相邻存储,数组越界访问可能会修改到循环变量的值,导致循环条件始终满足,从而形成死循环。理解这种情况有助于我们更好地理解和预防这类编程错误。
173 0
|
8月前
|
C++
C++ While 和 For 循环:流程控制全解析
本文介绍了C++中的`switch`语句和循环结构。`switch`语句根据表达式的值执行匹配的代码块,可以使用`break`终止执行并跳出`switch`。`default`关键字用于处理没有匹配`case`的情况。接着,文章讲述了三种类型的循环:`while`循环在条件满足时执行代码,`do/while`至少执行一次代码再检查条件,`for`循环适用于已知循环次数的情况。`for`循环包含初始化、条件和递增三个部分。此外,还提到了嵌套循环和C++11引入的`foreach`循环,用于遍历数组元素。最后,鼓励读者关注微信公众号`Let us Coding`获取更多内容。
57 0
|
Go
说说Go语言for循环中的继续、中断、跳出
说说Go语言for循环中的继续、中断、跳出
177 0
|
Web App开发 存储
用9种办法解决 for 循环取 i
用9种办法解决 for 循环取 i
113 0
|
编译器 C语言 C++
C语言数组越界造成的死循环例子,当你得到了这个意想不到的结果的时候,你肯定不知道为什么,看你还敢不敢越界访问数组了
C语言数组越界造成的死循环例子,当你得到了这个意想不到的结果的时候,你肯定不知道为什么,看你还敢不敢越界访问数组了
130 0

热门文章

最新文章

下一篇
开通oss服务