3

可能重复:
JavaScript 丢失带有私有/公共属性的“this”对象引用

为什么第二个警报显示窗口对象,而不是 O(甚至 P)对象?

window.name = "test window";

O = {
    name : 'object O',
    f : function() {
        alert(this.name); // 2nd alert
    }
}

P = {
    name : 'object P',
    f : function() {
        alert(this); // 1st alert
        var of = O.f;
        of();
    }
}

P.f();

换句话说,直接调用对象的函数怎么能在窗口的上下文中呢?我想这是一个关闭的问题,但我不知道切换发生在哪里。

谢谢你。

4

2 回答 2

3

当你这样做时:

var of = O.f;
of();

this在这里被破坏了,因为this它并没有真正锁定在 JavaScript 中。它非常具有延展性,在你的情况下,你可以做一些事情来让它更好地工作。

您可以执行以下任何操作来正确绑定它:

var of = O.f.bind(this);
of();

或者

var of = O.f
of.call(this);

要不就

O.f.call(this);
于 2012-06-27T02:01:15.657 回答
1

如果你想保持范围O然后试试这个

window.name = "test window";

O = {
    name : 'object O',
    f : function() {
        alert(this.name); // 2nd alert
    }
}

P = {
    name : 'object P',
    f : function() {
        alert(this.name); // 1st alert
        var of = O.f;
        of(); // loses scope since this.of does not exist it calls using anonymous window scope
        of.call(O); // passes O as scope
        of.call(P); // passes P as scope

        this.of = O.f;
        this.of(); // maintains current P scope


    }
}

P.f();​

这是一个小提琴:http: //jsfiddle.net/QVSDA/

于 2012-06-27T02:06:02.417 回答