var name = "the Window.";
var object = {
name:"Object",
getName: function(){
return this.name;
}
}
(object.getName)(); //"Object"
(object.getName = object.getName)(); //"the Window"
我运行此代码,它返回“窗口”,而我认为它应该是“对象”。请告诉我为什么?感谢。
答案 0 :(得分:3)
var name = "the Window.";
全局声明创建全局/窗口对象的属性。这相当于(或多或少):
var global = this;
global.name = 'the Window';
表达式:
(object.getName = object.getName)
返回object.getName
引用的函数。以下空参数列表(即()
)会使其被调用。
由于此值未通过调用设置,因此默认为global / window对象,因此该函数返回 global.name 的值。
答案 1 :(得分:1)
困惑的底线是我们正在尝试执行
(object.getName = object.getName)();
我们认为它应该打印“对象”。
实际上,它不会。这是一个简单的原因。如果你将这个陈述分成两个陈述,你就会得到它。
试试这个
var x = object.getName;
x();
它有点类似于你的情况,它给出了“窗口”。也是出于同样的原因x由窗口执行。
答案 2 :(得分:0)
不要以您习惯的经典OOP方式考虑this
,而应将this
视为调用函数的上下文。
在您的示例代码中,window
是getName
调用的上下文,无论该函数在何处声明。
答案 3 :(得分:0)
var x = object.getName;
x();
不太一样。 “=”只确保x引用与object.getName相同的内存地址,但x属于window而object.getName属于object。 我认为问题来自赋值表达式的返回值。 也许有一个临时变量来接收(object.getName = object.getName)的值,即
var temp = (object.getName = object.getName);
temp();//"the Window"
因此可能有意义。