http://wenbois2000.iteye.com/blog/897769 中的代码解读
使用闭包时,理解
内部函数是直接访问外部函数的实际变量,而非复制一份新变量是非常重要的 (!).下面是一个错误示范:
<BODY>
<INPUT TYPE="button" name='tt' VALUE="按钮1">
<INPUT TYPE="button" NAME="tt" VALUE="按钮2">
<INPUT TYPE="button" NAME="tt" VALUE="按钮3" ONCLICK="">
<SCRIPT LANGUAGE="JavaScript">
<!--
var add_the_handlers = function(nodes){
var i;
for(i = 0 ; i < nodes.length ; i ++){
nodes[i].onclick = function(e){
//(!) 直接访问了外部变量i, 并不是复制一份i的实例。
//所以随着i一直自增,最后弹出来的均是nodes.length
alert(i); //执行按钮点事件的时候 i的值是定义的那个i的值,
}
}
i=9//点击按钮的时候, 弹出 9
}
add_the_handlers( document.getElementsByName("tt") )
//-->
</SCRIPT>
矫正方法:
<BODY>
<INPUT TYPE="button" name='tt' VALUE="按钮1">
<INPUT TYPE="button" NAME="tt" VALUE="按钮2">
<INPUT TYPE="button" NAME="tt" VALUE="按钮3" >
<SCRIPT LANGUAGE="JavaScript">
<!--
var add_the_handlers = function(nodes){
//alert("开始执行")
var i;
for(i = 1 ; i < nodes.length ; i ++){
//alert("执行到for循环中:"+i)
nodes[i].onclick = function(i){
//alert("返回方法之前执行: "+i)
return function(e){ // 返回另一个匿名函数,但是该函数可以访问外面匿名函数构造时传入的 i 实例.
alert(i);
};
}(i); // 立即调用匿名函数 function(i);
}
//alert("执行结束")
}
add_the_handlers( document.getElementsByName("tt") )
//-->
</SCRIPT>
闭包示例:函数依然可以访问 value的值(闭包).
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var myObject_protected = function(){
// 这里通过一个函数的形式初始化了对象。由于函数作用域的关系,内部
// 函数依然可以访问 value的值(闭包).
var value = 0;
return {
increment : function(inc){
value += (typeof inc === 'number' ? inc : 1);
},
getValue : function(){
return value;
}
};
};
var myObject_p = new myObject_protected();
myObject_p.increment(10); //调用一次10
myObject_p.increment(10); //调用二次20
document.writeln(myObject_p.getValue());
//-->
</SCRIPT>
</BODY>
分享到:
相关推荐
在JavaScript中,闭包(Closure)是一个极其关键的概念,它使得内部函数能够访问到其外部函数的作用域内的变量,即使外部函数已经执行完毕。这一特性是基于JavaScript的函数作用域规则以及函数本身可以作为值进行...
JavaScript闭包函数是JavaScript语言中一个非常重要的特性,它允许一个函数访问并操作函数外部的变量。闭包的形成主要依赖于变量的作用域。在JavaScript中,变量的作用域分为全局作用域和局部作用域。局部作用域又...
在JavaScript中,每个函数都有自己的作用域,当一个函数内部定义了另一个函数时,内部函数可以访问外部函数的所有变量(包括参数)。 ##### 1. 作用域链 - **局部作用域**:函数内部定义的变量只能在该函数内部被...
函数可以返回内部函数,并将这个内部函数作为闭包传递给外部,使得外部代码无法直接访问内部函数的局部变量,而只能通过闭包提供的接口来进行操作。 总结一下,闭包是一个非常强大的功能,它可以让函数访问并操作...
在这个例子中,`createCounter` 函数返回了一个闭包,该闭包可以访问到外部函数中的 `count` 变量。每当调用 `counter()` 时,`count` 的值都会增加。 #### 四、闭包的特殊用途 ##### 1. 模拟块级作用域 ...
利用这一点,可以通过嵌套函数来访问外部函数的局部变量,因为内部函数可以访问外部函数的变量,这就是闭包的基础。 闭包(Closure)是一个可以包含自由变量的代码块,这个自由变量并不是在这个代码块或任何全局...
当满足以上条件时,内部函数会记住其外部函数的执行上下文,即使外部函数已经执行完毕并返回,内部函数仍然可以访问这些局部变量。 ##### 2.1 闭包的原理 闭包之所以能够访问外部函数的局部变量,是因为JavaScript...
JavaScript 闭包是一种强大的特性,它允许函数访问和操作其外部作用域的变量,即使在其外部函数执行完毕后,闭包依然能保持对外部变量的访问。闭包的关键在于内部函数能够记住它被创建时的环境,即它可以访问定义在...
由于外部不能直接访问函数内部的局部变量,可以通过在函数内部定义一个内部函数(如`f2`),使得这个内部函数可以访问到外部函数(如`f1`)的局部变量。当外部函数返回内部函数时,外部可以通过这个返回的函数间接...
我们可以创建一个外部函数,接受参数,并返回一个新的内部函数,这个内部函数能够访问外部函数的参数。在外部函数中,内部函数被返回并赋值给一个变量,然后这个变量作为 `setTimeout` 的参数。这样,当内部函数被 `...
- **Python 3之前**:在内部函数中修改外部函数的局部变量时,会遇到一个问题——Python解释器认为内部函数正在创建一个新的局部变量,而不是修改外部函数中的变量。这会导致 `UnboundLocalError` 错误。 - 解决...
由于内部函数持有对外部函数变量的引用,所以外部函数的变量不会被垃圾回收,仍然保持在内存中。 闭包的LEGB法则: - Local:函数内层作用域 - Enclosed:内层函数外的外层函数作用域 - Global:全局作用域 - ...
- **读取内部变量**:闭包提供了一种方式,使得外部可以间接访问到内部函数的局部变量,但不能直接修改它们。 - **保持变量状态**:由于闭包的存在,函数内部的变量不会在函数执行完后立即销毁,而是继续存在于...
内部函数可以记住并访问外部函数的变量,即使外部函数已经执行完毕。 4. **闭包的三个特性**: - 内部函数引用外部函数的变量。 - 外部函数的变量不会在内部函数执行完毕后被垃圾回收。 - 内部函数可以继续访问...
内嵌函数(内部函数)允许访问外部函数的变量,这是闭包的基础。 当我们谈论函数作为构造函数时,`new`操作符起到了关键作用。例如,`function constructorFn(a, b) {}`可以通过`new`关键字创建实例,如`var obj = ...
创建闭包的常见方式是在一个函数内部创建另一个函数,该函数可以访问外部函数的变量,即使外部函数已经执行完毕。 闭包有其优点和缺点。它们允许我们保存函数的私有状态,避免使用全局变量,从而使代码模块化和封装...