3

重複の可能性:
JavaScript がプライベート/パブリック プロパティで「this」オブジェクト参照を失う

2 番目のアラートで、O (または P) オブジェクトではなく、window オブジェクトが表示されるのはなぜですか?

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

JavaScript で実際にロックインされることはないthisため、ここでめちゃくちゃになります。thisそれは非常に順応性があり、あなたの場合、それをより良く機能させるためにいくつかのことを行うことができます.

これを適切にバインドするには、次のいずれかを実行できます。

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 に答える