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>
分享到:
相关推荐
闭包是指有权访问另一个函数作用域中的变量的函数,但作用域的配置机制有一个需要注意的地方,即闭包只能取得包含函数中任何变量的最后一个值。 如以下案例: function create(){ var arr = new Array(); ...
即使JavaScript中没有正式的私有对象属性的概念,但可以使用闭包来实现公有方法,而通过公有方法可以访问在包含作用域中定义的变量; 有权访问私有变量的公有方法叫做特权方法; 可以使用构造函数模式、原型模式...
在Laravel控制器写两个方法,一个是在内部创建一个闭包函数,一个是执行传过来的闭包函数,测试闭包的写法,use使用外部变量,及闭包函数的传参。如下: //测试闭包传参及use使用外部变量 public function ...
外层函数内部嵌套内部函数,外层函数分割变量作用域,并返回内部函数的引用。 # 外层函数负责分割作用域,内层函数才是闭包提供的功能。 外层函数返回内层函数的引用,供外部使用。 def my_line(k, b): # k,b只在my_...
所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变 ...简单的描述就是 ECMAScript 允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内
js闭包 ...• 每当外部封闭函数执行的时候就产生了闭包,也就是说闭包的创建并不一定需要内部函数返回。 • JavaScript中闭包作用域是词法作用域,即它在代码写好之后就被静态决定了它的作用域。
JS闭包理解 什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的。所有我们要用闭包来访问...所以简单的来说,闭包就是连接函数内部和外部的一座桥梁,通过闭包我们能够访问其他函数内部的变量
本文介绍了js匿名函数和闭包的相关内容,供大家参考...闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量 <scri
简单的说,Javascript允许使用内部函数—即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部...
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在...
简单的说,Javascript允许使用内部函数—即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部...
主要介绍了python函数的闭包问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
由于要求它可以访问另一个函数的作用于中的变量,所以我们往往是在一个函数的内部创建另一个函数,而“另一个函数”就是闭包。 比如之前提到过的作为比较函数: function createComparisonFunction(propertyName...
在函数 A 内部直接或者间接返回一个函数 B 2. B 函数内部使用着 A 函数的私有变量(私有数据) 3. A 函数外部有一个变量接受着函数 B 例如: function a() { // 这个 num 变量就是函数 a 的私有变量 var ...
闭包函数没有函数名称,直接在function()传入变量即可 使用时将定义的变量当作函数来处理 $cl = function($name){ return sprintf('hello %s',name); } echo $cli('fuck')` 直接通过定义为匿名函数的变量名称...
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量。 function f1(){...
js代码-函数表达式 闭包 私有变量
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部变量的函数。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。 比如下面的代码: function f1...