闭包(3)

闭包的防范:

闭包会导致多个执行函数公用一个公有变量,如果不是特殊需要,应尽量防止这种情况的发生。

    function test(){
				var arr =[];
				for (var i = 0;i < 10;i ++){
					arr[i] = function(){
						document.write(i +" ");
					}
				}
				return arr;
			}
			var myArr = test();
			for(var j = 0;j < 10;j++){
				myArr[j]();
			}

程序运行结果:

问题1.为什么是10?

问题2.为什么有10个10?

这个for循环转了10圈,执行了10次,产生了10个彼此独立的函数,并且最后把这10个函数放到数组里面去了,放到数组里面去了是不是还把数组返回了,也就是说这10个函数是不是和test都形成了一个闭包,对吧,既然是闭包,我们要访问test里面产生的变量的时候,访问的就是同一套吧,test里面产生了一个arr,又产生了一个i变量,那这10个函数在外部要访问i变量的时候是不是访问的是同一个i,那他访问的i到底是什么呢?首先什么时候访问的,她是在test执行完之后在下面一个for循环访问的吧,是不是前提条件是test已经执行完了,test执行完之后i到底变成啥了,是不是变成10了。只有等于10了,他才能结束。

注:arr[i] = function(){document.write(i +" ");}前面一个i变,第二个i不变吗?

不对,这个叫做赋值语句,把一个函数引用赋给数组的当前位,数组的当前位是要马上被索取出来的,第一个i跟第二个i有毛关系,函数体又不是现在执行,是折叠起来的,系统都不知道写的啥,根本无动于衷,函数的定义位置并不是函数的执行位置!!函数的执行是myArr[j]();到myArr[j]();的时候才去看函数里面是啥,是document.write(i +" ");

我就想按这个原型输出0-9,怎么解决?函数依然被保存在外部,但是保存在外部,输出的就是0-9。立即执行函数的思路是对的

解答:

    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 j = 0;j < 10;j++){
				myArr[j]();
			}

立即执行函数我放到for循环里面,是几个立即执行函数,是不是10个,转10圈不是10个吗?销毁不是从形态上销毁的,不是你这转一圈之后,咣,你这代码都没了,

那也太吓人了吧,是他执行过之后,他自己的引用销毁了,但这也是转了10圈,对吧。(function (0){arr[0] = function(){document.write(j +" ");}}(0)); (function (1){arr[1] = function(){document.write(j +" ");}}(1));……..咱也不接着写了,就当这个数组被保存到了外部,然后紧接着,在外部执行了,在外部执行的时候执行第一个函数,他是不是要找j,她找的是谁的j?第一个函数找的j,是第一个立即执行函数里的j,第二个函数找的j,是第二个立即执行函数里的j….这是不是有10个j和他对应了,每一个立即执行函数里的j是不在变得吧,所以到外部,我们找这个document.write(j +" ");的时候,找的是不是他原本对应的那个j。

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/81224478