javascript 闭包问题 javascript 闭包javascript闭包 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码1中,getname的值为function(){ return this.name;}针对object调用此方法时,this指向object。代码2中,getname的值为function(){ return function(){ return this.name; }}在全局范围调用object.getname()后,返回:function(){ return this.name;}此时在全局范围再执行此函数,this指向全局对象(window)。代码3中,在定义getname的时候,此函数被立即执行:function(){ var that=this; return function(){ return that.name; }}因为执行换当前为全局环境,所以that指向window。代码4中,调用object2.getname()时,下面的函数被执行:function(){ var that=this; return function(){ return that.name; }}执行环境为object2,所以that指向了object2。 要分清,函数的调用者,和拥有者。函数的调用者才是this的指代者,而不是拥有者。再者,在js里'{}'也就是所谓的大括号并不产生新的作用域,只有function,也就是函数才能产生新的作用域。 (1)第一段:var name="window"; var object = { name:"me", getname:(function(){ return function(){ return this.name; } })() }; //getname后面的自执行在执行完毕返回一个函数后才会给getname赋值(也就是把返回的函数赋 //给getname),这样整个obj才完成声明。所以,这里的object完全等价于: var object = { name:"me", getname:function(){ return this.name; } };(2)第三段:var name="window"; var object1 = { name:"me", getname:(function(){//标记一下:外层函数 var that=this; return function(){//标一下:内层函数 return that.name; } })() }; //同上,getname后面的那一串并不是getname最终的值,在自执行完毕后,obj1实际上是: var object1 = { name:"me", getname:function(){ return that.name; } }; alert(object1.getname()); //window还有一点需要明白外层函数并不是object1的getname的属性值(它只是一个用来返回“getname真正值”的一个函数而已),所以它的this指向的window(在这里指的是全局对象,不是name的值--字符串“window”),当然that也会指向window内层函数。显然内层函数引用着外层函数中的that,所以最终return的是window.name即:字符串“window”.(3)第四段:var name2="window"; var object2 = { name:"me", getname:function(){//外层函数 var that=this; return function(){ return that.name; } } }; //这里的getname的值就不和上面一样需要再计算了,因为它后面不是表达式,而是一个函数类型的值,这 //个函数(也就是外层函数)就是getname指向的值 alert(object2.getname()()); //me既然外层函数是object2的一个属性值,那么它的this就指向object2,所以that也指向object2,当然它返回的函数因为引用着that 自然会返回object.name即“me”。 JSp 你们碰没碰到jquery的这样的问题么 history.go的问题 javascript中有没有类似引用传递参数的方法呀,怎么用呢?请高手指点 关于ajax的调用如何接收返回字符串 怎么给dropdown中用代码添加option? js 访问frame里面的元素 关于js最后的;的问题,是不是可有可无的? 正则表达式何解 关于字符串的处理 浏览器内存泄露有专门的检测工具吗?欢迎推荐,急!!! 通过后台配置,动态生成个性化web前端界面,请大家说一下思路,感谢!
function(){
return this.name;
}
针对object调用此方法时,this指向object。代码2中,getname的值为
function(){
return function(){
return this.name;
}
}
在全局范围调用object.getname()后,返回:
function(){
return this.name;
}
此时在全局范围再执行此函数,this指向全局对象(window)。
代码3中,在定义getname的时候,此函数被立即执行:
function(){
var that=this;
return function(){
return that.name;
}
}
因为执行换当前为全局环境,所以that指向window。代码4中,调用object2.getname()时,下面的函数被执行:
function(){
var that=this;
return function(){
return that.name;
}
}
执行环境为object2,所以that指向了object2。
var object = {
name:"me",
getname:(function(){
return function(){
return this.name;
}
})()
};
//getname后面的自执行在执行完毕返回一个函数后才会给getname赋值(也就是把返回的函数赋
//给getname),这样整个obj才完成声明。所以,这里的object完全等价于:
var object = {
name:"me",
getname:function(){
return this.name;
}
};
(2)第三段:var name="window";
var object1 = {
name:"me",
getname:(function(){//标记一下:外层函数
var that=this;
return function(){//标一下:内层函数
return that.name;
}
})()
};
//同上,getname后面的那一串并不是getname最终的值,在自执行完毕后,obj1实际上是:
var object1 = {
name:"me",
getname:function(){
return that.name;
}
};
alert(object1.getname()); //window还有一点需要明白外层函数并不是object1的getname的属性值(它只是一个用来返回“getname真正值”的一个函数而已),所以它的this指向的window(在这里指的是全局对象,不是name的值--字符串“window”),当然that也会指向window内层函数。显然内层函数引用着外层函数中的that,所以最终return的是window.name即:字符串“window”.(3)第四段:var name2="window";
var object2 = {
name:"me",
getname:function(){//外层函数
var that=this;
return function(){
return that.name;
}
}
};
//这里的getname的值就不和上面一样需要再计算了,因为它后面不是表达式,而是一个函数类型的值,这
//个函数(也就是外层函数)就是getname指向的值
alert(object2.getname()()); //me既然外层函数是object2的一个属性值,那么它的this就指向object2,所以that也指向object2,当然它返回的函数因为引用着that 自然会返回object.name即“me”。