» 2010-5-15 17:14:45 已被归档于 读书笔记
闭包的定义:
其实每个函数都是闭包.
-----------------------------以下个人观点(^^如有不妥,请砸砖头)---------------
闭包其实是作用域链的一种表现而已^^.
当进入一个函数中时.会创建一个执行环境,其中包括一个调用对象,这个调用对象里包括当前函数里的变量(属性),方法.
函数进行执行里,会根据这个当前调用对象向上进行查找,顶部对象是window对象.
有个要注意:
|----------JavaScript的变量作用域是在定义时被确定而不是在被执行时--------|
看别人的Code例子吧
1.
一个实例里包含了一个属性和一个方法,方法里又返回了一个方法,返回的这个方法里返回一个this引用对象的name属性;
执行的时候是object.getNameFunc()().先执行对象object的公用方法.
然后再执行公用方法里返回的那个匿名函数,这时的作用域会查找this.name.匿名函数里没有定义.找getNameFunc方法,getNameFunc方法里也没有,由于getNameFunc方法是公用方法,再向上查找就是window对象即全局变量.
|----------------------this是执行时的上下文对象--------------------------|
2.
运行后,发现点击都是5;
当badClosureExample函数执行后,badClosureExample里的click的匿名函数的i值已为5,可click事件并没有执行,而i相对click事件的匿名函数是外部变量;
所以解决的方法是让每个i成为click事件的私有属性
不管是
还是
其实都是为click的那个匿名函数创造一个作用域保存私有变量.防止它调用它的外部(或者说是父级里的属性);
|------------------------看看,都是作用域问题^^还得研究ing....-------------------------|
所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
其实每个函数都是闭包.
-----------------------------以下个人观点(^^如有不妥,请砸砖头)---------------
闭包其实是作用域链的一种表现而已^^.
当进入一个函数中时.会创建一个执行环境,其中包括一个调用对象,这个调用对象里包括当前函数里的变量(属性),方法.
函数进行执行里,会根据这个当前调用对象向上进行查找,顶部对象是window对象.
有个要注意:
|----------JavaScript的变量作用域是在定义时被确定而不是在被执行时--------|
看别人的Code例子吧
1.
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
一个实例里包含了一个属性和一个方法,方法里又返回了一个方法,返回的这个方法里返回一个this引用对象的name属性;
执行的时候是object.getNameFunc()().先执行对象object的公用方法.
然后再执行公用方法里返回的那个匿名函数,这时的作用域会查找this.name.匿名函数里没有定义.找getNameFunc方法,getNameFunc方法里也没有,由于getNameFunc方法是公用方法,再向上查找就是window对象即全局变量.
|----------------------this是执行时的上下文对象--------------------------|
2.
运行后,发现点击都是5;
当badClosureExample函数执行后,badClosureExample里的click的匿名函数的i值已为5,可click事件并没有执行,而i相对click事件的匿名函数是外部变量;
所以解决的方法是让每个i成为click事件的私有属性
不管是
function badClosureExample(){
for (var i = 0; i <document.getElementsByTagName('a').length; i++) {
var element =document.getElementsByTagName('a');
element[i].i=i;
element[i] .onclick = function(){
alert(this.i);
};
}
}
还是
function badClosureExample(){
for (var i = 0; i <document.getElementsByTagName('a').length; i++) {
var element =document.getElementsByTagName('a');
element[i] .onclick = new cloS(i);
}
}
function cloS(i){
return function(){
alert(i);
};
}
其实都是为click的那个匿名函数创造一个作用域保存私有变量.防止它调用它的外部(或者说是父级里的属性);
|------------------------看看,都是作用域问题^^还得研究ing....-------------------------|