4
var name = "the Window.";
var object = {
    name:"Object",
    getName: function(){
        return this.name;
    }
}
(object.getName)(); //"Object"
(object.getName = object.getName)(); //"the Window"

我运行这段代码,它返回“窗口”,而我认为它应该是“对象”。请告诉我为什么?谢谢。

4

4 回答 4

3
var name = "the Window.";

全局声明创建全局/窗口对象的属性。这相当于(或多或少):

var global = this;
global.name = 'the Window';

表达方式:

(object.getName = object.getName)

返回 引用的函数object.getName。下面的空参数列表(即())导致它被调用。

由于this值不是由调用设置的,它默认为 global/window 对象,因此该函数返回global.name的值。

于 2013-04-19T04:53:36.627 回答
1

混乱的底线是我们正在尝试执行

(object.getName = object.getName)();

我们认为它应该打印“对象”。

实际上,它不会。这是一个简单的原因。如果你把这个语句分成 2 个语句,你会得到它。

  • 分配:object.getName 被分配了一些处理程序。在这种情况下,它被分配给它自己。
  • 处理程序的执行。现在,处理程序已执行,但这次我们没有上下文。处理程序由窗口执行。所以你得到了 window.name ,它是“窗口”。

尝试这个

var x = object.getName;
x();

它与您的情况有些相似,它提供了“窗口”。也是出于同样的原因 x 由 window 执行。

于 2013-04-19T05:00:39.493 回答
0

与其以this您习惯的经典 OOP 方式思考,this不如将其视为调用函数的上下文。

在您的示例代码中,windowgetName调用的上下文,无论该函数在何处声明。

于 2013-04-19T05:09:54.303 回答
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"

因此可能是有道理的。

于 2014-01-31T16:41:20.007 回答