var name = "the Window.";
var object = {
name:"Object",
getName: function(){
return this.name;
}
}
(object.getName)(); //"Object"
(object.getName = object.getName)(); //"the Window"
我运行这段代码,它返回“窗口”,而我认为它应该是“对象”。请告诉我为什么?谢谢。
var name = "the Window.";
var object = {
name:"Object",
getName: function(){
return this.name;
}
}
(object.getName)(); //"Object"
(object.getName = object.getName)(); //"the Window"
我运行这段代码,它返回“窗口”,而我认为它应该是“对象”。请告诉我为什么?谢谢。
var name = "the Window.";
全局声明创建全局/窗口对象的属性。这相当于(或多或少):
var global = this;
global.name = 'the Window';
表达方式:
(object.getName = object.getName)
返回 引用的函数object.getName
。下面的空参数列表(即()
)导致它被调用。
由于this值不是由调用设置的,它默认为 global/window 对象,因此该函数返回global.name的值。
混乱的底线是我们正在尝试执行
(object.getName = object.getName)();
我们认为它应该打印“对象”。
实际上,它不会。这是一个简单的原因。如果你把这个语句分成 2 个语句,你会得到它。
尝试这个
var x = object.getName;
x();
它与您的情况有些相似,它提供了“窗口”。也是出于同样的原因 x 由 window 执行。
与其以this
您习惯的经典 OOP 方式思考,this
不如将其视为调用函数的上下文。
在您的示例代码中,window
是getName
调用的上下文,无论该函数在何处声明。
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"
因此可能是有道理的。