3

this one への質問をフォローアップし、 html から javascript オブジェクト メソッドを呼び出します。これを Firebug でデバッグしています。

function Fred() {
    this.a = 1;
    function foo() {
        if (a == 1) {
            a++;
        }
        var e = 0;
    }
    this.bar = function () {
        var a = 3;
        foo();
    };
}

HTML ファイルから、 の新しいインスタンスを作成し、Fredを呼び出しbar()ます。Firebug では、 への呼び出しで、私のインスタンスがbar()Watch ビューに表示されます。がを呼び出すと、 のインスタンスに変更されます。私は同じままであることを期待していたでしょう。thisFredbar()foo()thisWindowthis

たぶん、閉鎖に関するより多くの是正トレーニング。

4

2 に答える 2

4

JavaScript では、関数を呼び出す場合、どこthisを指すかは呼び出しのコンテキストに依存します。

関数呼び出しパターン

関数を関数として呼び出す場合、つまり:

foo();

次にthis、グローバル コンテキストを参照します。これは、ブラウザではwindowオブジェクトを意味します。

メソッド呼び出しパターン

代わりに、メソッドのような関数を呼び出す場合、つまり:

x.foo();

次にthis、関数を呼び出したオブジェクト、つまり を参照しますx

呼び出し/呼び出しパターンの適用

関数を関数として呼び出し、参照するものを変更する場合は、次のように または関数thisを使用できます。callapply

foo.call(x);
foo.apply(x);

どちらも同じことを行います:fooのメソッドとして呼び出されたかのように呼び出しxます。それらの違いは、パラメーターを渡す場合です。パラメーターをcallコンマ区切りのリストとして指定する必要がありますがapply、配列を渡すことができます。

foo.call(x, p1, p2, p3, ...);
foo.apply(x, [ p1, p2, p3, ... ]);

コンストラクター呼び出しパターン

完全を期すために、4 番目のオプションもありthisます。関数をコンストラクターとして呼び出す場合this、新しく作成されたオブジェクトを指します。

new foo();

これをすべての人にわかりやすくするために、JavaScript では、コンストラクターとして機能する関数の名前を大文字で始めるというベスト プラクティスがあります。つまり、次のようになります。

new Foo();

それでも効果は変わらない。

于 2013-03-01T20:36:13.713 に答える
2

.call()または_.apply()

最初のパラメーターは、次の関数が呼び出されるコンテキストを示します。

例えば

this.bar = function () {
    var a = 3;
    foo.call(this);
};
于 2013-03-01T20:31:42.473 に答える