关于javascript中的“this”

时间:2013-04-19 04:45:50

标签: javascript

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

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

4 个答案:

答案 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)();

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

实际上,它不会。这是一个简单的原因。如果你将这个陈述分成两个陈述,你就会得到它。

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

试试这个

var x = object.getName;
x();

它有点类似于你的情况,它给出了“窗口”。也是出于同样的原因x由窗口执行。

答案 2 :(得分:0)

不要以您习惯的经典OOP方式考虑this,而应将this视为调用函数的上下文。

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

答案 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"
因此可能有意义。