`
laj12347
  • 浏览: 13664 次
  • 性别: 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闭包函数访问外部变量的方法

    闭包是指有权访问另一个函数作用域中的变量的函数,但作用域的配置机制有一个需要注意的地方,即闭包只能取得包含函数中任何变量的最后一个值。 如以下案例: function create(){  var arr = new Array();     ...

    JS匿名函数、闭包

    即使JavaScript中没有正式的私有对象属性的概念,但可以使用闭包来实现公有方法,而通过公有方法可以访问在包含作用域中定义的变量; 有权访问私有变量的公有方法叫做特权方法; 可以使用构造函数模式、原型模式...

    PHP闭包函数传参及使用外部变量的方法

    在Laravel控制器写两个方法,一个是在内部创建一个闭包函数,一个是执行传过来的闭包函数,测试闭包的写法,use使用外部变量,及闭包函数的传参。如下: //测试闭包传参及use使用外部变量 public function ...

    Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例

    外层函数内部嵌套内部函数,外层函数分割变量作用域,并返回内部函数的引用。 # 外层函数负责分割作用域,内层函数才是闭包提供的功能。 外层函数返回内层函数的引用,供外部使用。 def my_line(k, b): # k,b只在my_...

    JAVASCRIPT闭包详解

    所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变 ...简单的描述就是 ECMAScript 允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内

    JS中的闭包理解。。。。。。。。

    js闭包 ...• 每当外部封闭函数执行的时候就产生了闭包,也就是说闭包的创建并不一定需要内部函数返回。 • JavaScript中闭包作用域是词法作用域,即它在代码写好之后就被静态决定了它的作用域。

    js闭包的理解以及作用.docx

    JS闭包理解 什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的。所有我们要用闭包来访问...所以简单的来说,闭包就是连接函数内部和外部的一座桥梁,通过闭包我们能够访问其他函数内部的变量

    javascript笔记之匿名函数和闭包

    本文介绍了js匿名函数和闭包的相关内容,供大家参考...闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量 &lt;scri

    JavaScript中闭包的写法和作用详解

    简单的说,Javascript允许使用内部函数—即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部...

    JavaScript闭包和回调详解

     闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在...

    JavaScript中的闭包

    简单的说,Javascript允许使用内部函数—即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部...

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

    主要介绍了python函数的闭包问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    浅谈JavaScript的闭包函数

    由于要求它可以访问另一个函数的作用于中的变量,所以我们往往是在一个函数的内部创建另一个函数,而“另一个函数”就是闭包。  比如之前提到过的作为比较函数: function createComparisonFunction(propertyName...

    JS闭包是是什么?

    在函数 A 内部直接或者间接返回一个函数 B 2. B 函数内部使用着 A 函数的私有变量(私有数据) 3. A 函数外部有一个变量接受着函数 B 例如: function a() { // 这个 num 变量就是函数 a 的私有变量 var ...

    PHP闭包函数详解

    闭包函数没有函数名称,直接在function()传入变量即可 使用时将定义的变量当作函数来处理 $cl = function($name){ return sprintf('hello %s',name); } echo $cli('fuck')` 直接通过定义为匿名函数的变量名称...

    javascript深入理解js闭包

    Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 var n=999;  function f1(){  alert&#40;n&#41;;  }  f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量。  function f1(){...

    js代码-函数表达式 闭包 私有变量

    js代码-函数表达式 闭包 私有变量

    JavaScript 闭包的使用场景

     由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部变量的函数。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。  比如下面的代码: function f1...

Global site tag (gtag.js) - Google Analytics