`
laj12347
  • 浏览: 14213 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
文章分类
社区版块
存档分类
最新评论

js使用闭包时,内部函数是直接访问外部函数的实际变量而非复制一份新变量

阅读更多
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 中的闭包是指内部函数可以访问外部函数作用域中的变量

    在JavaScript中,闭包(Closure)是一个极其关键的概念,它使得内部函数能够访问到其外部函数的作用域内的变量,即使外部函数已经执行完毕。这一特性是基于JavaScript的函数作用域规则以及函数本身可以作为值进行...

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

    JavaScript闭包函数是JavaScript语言中一个非常重要的特性,它允许一个函数访问并操作函数外部的变量。闭包的形成主要依赖于变量的作用域。在JavaScript中,变量的作用域分为全局作用域和局部作用域。局部作用域又...

    Javascript 闭包完整解释

    在JavaScript中,每个函数都有自己的作用域,当一个函数内部定义了另一个函数时,内部函数可以访问外部函数的所有变量(包括参数)。 ##### 1. 作用域链 - **局部作用域**:函数内部定义的变量只能在该函数内部被...

    javascript闭包的理解

    函数可以返回内部函数,并将这个内部函数作为闭包传递给外部,使得外部代码无法直接访问内部函数的局部变量,而只能通过闭包提供的接口来进行操作。 总结一下,闭包是一个非常强大的功能,它可以让函数访问并操作...

    JS匿名函数、闭包

    在这个例子中,`createCounter` 函数返回了一个闭包,该闭包可以访问到外部函数中的 `count` 变量。每当调用 `counter()` 时,`count` 的值都会增加。 #### 四、闭包的特殊用途 ##### 1. 模拟块级作用域 ...

    JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解

    利用这一点,可以通过嵌套函数来访问外部函数的局部变量,因为内部函数可以访问外部函数的变量,这就是闭包的基础。 闭包(Closure)是一个可以包含自由变量的代码块,这个自由变量并不是在这个代码块或任何全局...

    js闭包详细讲解

    当满足以上条件时,内部函数会记住其外部函数的执行上下文,即使外部函数已经执行完毕并返回,内部函数仍然可以访问这些局部变量。 ##### 2.1 闭包的原理 闭包之所以能够访问外部函数的局部变量,是因为JavaScript...

    [深入理解JS闭包]帮助你快速学习js的闭包,简单高效的文档资源

    JavaScript 闭包是一种强大的特性,它允许函数访问和操作其外部作用域的变量,即使在其外部函数执行完毕后,闭包依然能保持对外部变量的访问。闭包的关键在于内部函数能够记住它被创建时的环境,即它可以访问定义在...

    javascript深入理解js闭包.docx

    由于外部不能直接访问函数内部的局部变量,可以通过在函数内部定义一个内部函数(如`f2`),使得这个内部函数可以访问到外部函数(如`f1`)的局部变量。当外部函数返回内部函数时,外部可以通过这个返回的函数间接...

    JS闭包可被利用的常见场景

    我们可以创建一个外部函数,接受参数,并返回一个新的内部函数,这个内部函数能够访问外部函数的参数。在外部函数中,内部函数被返回并赋值给一个变量,然后这个变量作为 `setTimeout` 的参数。这样,当内部函数被 `...

    详解python函数的闭包问题(内部函数与外部函数详述)

    - **Python 3之前**:在内部函数中修改外部函数的局部变量时,会遇到一个问题——Python解释器认为内部函数正在创建一个新的局部变量,而不是修改外部函数中的变量。这会导致 `UnboundLocalError` 错误。 - 解决...

    python中的闭包函数

    由于内部函数持有对外部函数变量的引用,所以外部函数的变量不会被垃圾回收,仍然保持在内存中。 闭包的LEGB法则: - Local:函数内层作用域 - Enclosed:内层函数外的外层函数作用域 - Global:全局作用域 - ...

    js闭包的介绍

    - **读取内部变量**:闭包提供了一种方式,使得外部可以间接访问到内部函数的局部变量,但不能直接修改它们。 - **保持变量状态**:由于闭包的存在,函数内部的变量不会在函数执行完后立即销毁,而是继续存在于...

    JS 闭包的理解

    内部函数可以记住并访问外部函数的变量,即使外部函数已经执行完毕。 4. **闭包的三个特性**: - 内部函数引用外部函数的变量。 - 外部函数的变量不会在内部函数执行完毕后被垃圾回收。 - 内部函数可以继续访问...

    深度探讨javascript函数的原型链和闭包

    内嵌函数(内部函数)允许访问外部函数的变量,这是闭包的基础。 当我们谈论函数作为构造函数时,`new`操作符起到了关键作用。例如,`function constructorFn(a, b) {}`可以通过`new`关键字创建实例,如`var obj = ...

    JavaScript 匿名函数和闭包介绍

    创建闭包的常见方式是在一个函数内部创建另一个函数,该函数可以访问外部函数的变量,即使外部函数已经执行完毕。 闭包有其优点和缺点。它们允许我们保存函数的私有状态,避免使用全局变量,从而使代码模块化和封装...

Global site tag (gtag.js) - Google Analytics