闭包的概念
优点
缺点
解决方法——使用完变量后,手动将它赋值为null
由于闭包涉及跨作用域的访问,所以会导致性能损失。
解决方法——通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
代码片段一:
- <p>1p>
- <p>2p>
- <p>3p>
- var ps = document.querySelectorAll('p');
- for (var i = 0; i < ps.length; i++) {
- ps[i].onclick = function () {
- console.log(i);
- }
- }
- console.log(i); //3

这是因为for循环已经加载完毕,可以看到每个p标签都有点击事件,而onclick是点击之后才执行的,属于同步和异步问题。当我们点击的时候,for循环已经完成,所以i的值恒为3。产生这样的问题在于这个i的值在初始化完成的时候就已经是3了
原因
解决方案
1.let/const 块级作用域(推荐)
- var ps = document.querySelectorAll('p');
- for (let i = 0; i < ps.length; i++) {
- ps[i].onclick = function () {
- console.log(i);
- }
- }
- console.log(i);
2.闭包:用立即执行的匿名函数把它包装起来,这样子做的话,log(i)的值就取自闭包环境中的i
- for (var i = 0; i < ps.length; i++) {
- (function (i) {
- ps[i].onclick = function () {
- console.log(i);
- }
- })(i);
- }
3.添加自定义属性
- for (var i = 0; i < ps.length; i++) {
- //自定义属性标签
- ps[i].index = i;
- ps[i].onclick = function () {
- console.log(this.index);
- }
- }