程序笔记   发布时间:2022-05-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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,请注明来意。
标签:let