前端JS学习笔记(1)

闭包的触发和解决

1.触发情况:在函数内部还有函数,并且内部的函数被保存到外部时会发生闭包。
2.用一个简单的例子来展示:
<script>
	function test() {
     
     
	    var arr = [];
	    for(var i = 0; i < 10; i ++){
     
     
	
	        arr[i] = function (){
     
     
	          document.write(i + ' ');
	        }
	
	    }
	    return arr;
	}
	
	var Myarr = test();
	for(var i = 0; i < 10; i ++){
     
     
	  Myarr[i]();
	}
</script>

运行结果:
10 10 10 10 10 10 10 10 10 10

  • 分析:这里希望给数组每一位赋值一个能打印当前数组下标的函数,但是函数在定义时没有被执行,当数组被保存到外部时,函数里面的 i 已经变成10了。
3.解决方法:立即执行函数
<script>
 function test() {
     
     
	var arr = [];
	
	for(var i = 0; i < 10; i ++) {
     
     
	    (function(j) {
     
     
	        arr[j] = function () {
     
     
	            document.write(j + ' ');
	        }
	    }(i))
	}
	return arr;
}

var Myarr = test();
for(var i = 0; i < 10; i ++) {
     
     
	Myarr[i]();
}
</script>

运行结果:
0 1 2 3 4 5 6 7 8 9

  • 分析:要想让数组的下标实时被保存下来,应该使用立即执行函数把当前的 i 值赋值给形参 j ,那么Myarr在被赋值时就能获取每个数组成员的作用域链得到 j 的值。

猜你喜欢

转载自blog.csdn.net/weixin_45688536/article/details/108160911
今日推荐