“这”在javascript中丢失,同时引用另一个对象的功能

时间:2012-06-27 01:56:00

标签: javascript window this

  

可能重复:
  JavaScript losing “this” object reference with private/public properties

为什么第二个警报显示窗口对象,而不显示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();

换句话说,如何直接调用对象的函数在窗口的上下文中?我想这是关闭的问题,但我不知道转换发生在哪里。

谢谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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/