大佬教程收集整理的这篇文章主要介绍了let 和循环闭包,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
{
var result = []
for (var i = 0; i < 10;="" i++)="" {="">ult[i] = function () {
return i
}
}
return result
}
这个是臭名昭著的循环加闭包。匿名函数调用的时候,会在作用域链上找i
,最后它会在外层函数的作用域里面找到这个变量,而这个变量的值就是10,所有的匿名函数都会返回10。
针对这段代码,通常有两个解决方案:
{
var result = []
for (var i = 0; i < 10;="" i++)="" {="">ult[i] = function (num) {
return function () {
return num
}
}(i)
}
return result
}
这个办法就是每次定义匿名函数的时候都把相应的i
截取下来,而不需要在调用的时候去作用域链找这个值。
还有一个用let
的:
{
var result = []
for (let i = 0; i < 10;="" i++)="" {="">ult[i] = function () {
return i
}
}
}
经常很多地方会说,用这个办法能解决是因为 let 能创建块级作用域,但是我从来没理解为什么块级作用域和这有什么关系,直到今天看 NCZ 的 href="https://leanpub.com/understandinges6/read#leanpub-auto-block-bindings">Understanding ES6:
如果 let 做的仅仅是创建一个块级作用域的话,循环里面的匿名函数还是要在作用域链上去找i
,区别只不过是之前的i
是在外层函数的变量对象里找到的,而现在是在循环块的变量对象里找到的,而已。重要的是,let 使得每次循环都给了匿名函数一个i
的值,它不必在调用的时候再去作用域链上找了。
以上是大佬教程为你收集整理的let 和循环闭包全部内容,希望文章能够帮你解决let 和循环闭包所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。