代码一
var name = "The Window"; var object = {
name : "My Object", getNameFunc : function(){
return function(){
return this.name;
}; } }; alert(object.getNameFunc()());
代码二var object = {
name : "My Object", getNameFunc : function(){
var that = this;
return function(){
return this.name;
};
} };
alert(object.getNameFunc()());问题1.
为啥代码一中 ,运行结果不是My object,而且是方法调用,this的运行环境是object对象中呀
代码二为啥这样一改,就变成了M yobject
希望有详细解释 看了阮一峰的博客产生的疑问
问题2
sublimeText 出现了[WinError 2
] 系统找不到指定的文件。不能编译js代码,不知道如何解决
return this.name;
应该是
return that.name;
吧
var _=object.getNameFunc()
_()
所以this是window
如果是that写错了的话 很正常 that=object;
代码二里是 return that.name
this代表的是一个对象,this所在环境的对象
this一般出现在函数的执行体内部,代表的是函数的持有者(方法持有者)
如果this出现在非函数内部,代表的是window对象
this最终代表的是调用者(new call apply this可以改变,代表的是调用)
总结:this就是离它最近的function修饰的持有对象
最近: 不是哥哥,是父级
修饰: 只有对象的成员是这个函数时,才叫持有者
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
};
alert(object.getNameFunc()());
解析:object.getNameFunc()()
首先是object.getName() ===》调用这个方法,得到一个返回值:
function() {
return this.name;
};
===>此时返回的函数暴露在了window环境里面,因为你是在window的环境下调用的所以它返回的函数也会暴露在window环境下;
我们在往下分析:
object.getNameFunc()()
由于object.getName() 返回了一个函数到window下,所以我们此时可以写成
(window.这个函数)==》 function() {
return this.name;
}();this就是离它最近的function修饰的持有对象,此时持有它的就是window
所以我们就这里的this就是window对象
运行这段函数 function() {
return this.name;
}
我们就可以得到 alert出 : The Window
你的代码2我运行弹出来的是空白,检查下你第二段代码是否正确
因为getNameFunc的调用位置为object,所以代码二中的that实际上保存也就是object,但是return返回函数的话,会导致this绑定丢失,因为返回的函数实际上为隐式声明(假如你返回的函数名为fn1,则隐私声明为var fn=fn1)作用域则变为接收该函数的作用域,在这里则变成全局,使用that把this存储起来,可以达到你要的效果,实则引用了getNameFunc中的this
关于隐式丢失,可以参考以下代码
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
};
var bar=obj.foo;
var a="window";
bar()