手机版

JavaScript闭包函数访问外部变量的方法

时间:2021-09-10 来源:互联网 编辑:宝哥软件园 浏览:

闭包是指一个函数可以访问另一个函数范围内的变量。但是作用域的配置机制需要注意,即闭包只能得到函数中任意变量的最后一个值。

如以下情况:

函数create(){ var arr=new Array();for(var I=0;i10I){ arr[I]=function(){ return I;};}返回arr} var c _ arr=create();for(var I=0;ic _ arr.lengthI){ document . write(' c _ arr[' I ']=' c _ arr[I]()' br/');}执行结果:

JS闭包

从表面上看,似乎每个函数返回的I的值都不一样,比如c_arr[0]的值应该是0,c_arr[1]的值应该是1,以此类推。因此,每个函数返回10。为什么呢?

因为create()函数的活动对象存储在每个函数的作用域链中,所以它们都引用同一个变量I。当for循环结束时,I的值变为10。此时,每个函数都引用保存变量I的同一个变量对象。

通过创建另一个域名函数,我们可以强制闭包的行为满足期望,这样每个位置都对应相应的值。

函数create(){ var arr=new Array();for(var I=0;i10I){ arr[I]=function(num){ return function(){ return num;};}(I);}返回arr} var c _ arr=create();for(var I=0;ic _ arr.lengthI){ document . write(' c _ arr[' I ']=' c _ arr[I]()' br/');}执行结果:

JS闭包

定义了一个匿名函数,并立即执行匿名函数对数组的机器赋值,其中匿名函数有一个参数num,这是最终函数要返回的值。我们在调用每个函数时都会传入变量I。因为函数参数是按值传递的,所以变量I的当前值将被赋给参数num。在这个匿名函数中,创建并返回了一个用于访问num的闭包,这样arr数组中的每个函数都有自己num变量的副本,因此它可以返回不同的值。

经典例子

我们来看一个经典的例子。让我们假设页面有一组按钮标签。我们使用脚本将click事件绑定到这组按钮标签,当单击时,它会弹出它是哪个标签。

meta charset=' utf-8 '/button first/button button second/button button third/button script type=' text/JavaScript ' varobj=document . getelementsbyname(' button ');for(var I=0;iobj.length我。onclick=function(){ alert(I);};}/script单击每个按钮的结果

JS闭包

从表面上看,点击每个标签应该会弹出不同的数字

第一个应该弹出0;

第二个应该弹出1;

等等。

但结果是所有按钮都弹出4,这显然不是我们想要的结果。

让我们改变程序

meta charset=' utf-8 '/button first/button button second/button button third/button script type=' text/JavaScript ' varobj=document . getelementsbyname(' button ');for(var I=0;iobj.length我。onclick=function(num){ return function(){ alert(num);} }(I);}/script单击第二个

JS闭包

点击第四个

JS闭包

我们只需要在函数中建立一个匿名函数,和上面的情况一样。匿名函数可以捕获外部变量I,结果每个按钮的I值都不一样。

版权声明:JavaScript闭包函数访问外部变量的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。