7

「this」がWindowオブジェクトを指すことに関して、 Javascript this points to Windowオブジェクトについて質問しました。

ここにソースコードがあります

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
        callback(); 
    }, 
    test2: function(){ 
        console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

Tim Down は次のように書いています。

ソースコードに示されているように、実際の名前で関数を呼び出すことと callback() の違いは何ですか?

archive.action 内にある場合、test2 の console.log(this) はどのように Window を指しますか?

4

2 に答える 2

11

JavaScript では、4 つの異なる呼び出しパターンを使用して関数を呼び出すことができます。

  • 関数呼び出し
  • メソッド呼び出し
  • 申し込み・呼び出し
  • 建設呼び出し

パターンの主な違いは、thisパラメーターの初期化方法です。

を使用すると、メソッド パターンで関数をoArchive.action.test2()呼び出すことになり、この場合はオブジェクトにバインドされます。JavaScript は、呼び出し式に絞り込み (つまり、ドット式または式)が含まれている場合は常にメソッド パターンを使用します。test2()thisaction.[subscript]

一方、関数がオブジェクトのプロパティでない場合は、関数パターンを使用して呼び出されます。この場合、thisパラメーターはグローバル オブジェクトにバインドされており、実際にこれが JavaScript がcallback()関数を呼び出す方法です。

Douglas Crockfordは彼のGood Parts bookで、これは言語の設計上の誤りであると説明し、考えられるいくつかの回避策を提案しています。あなたの場合、簡単な回避策の 1 つは、call()またはapply()を使用してコールバックを呼び出すことです。Tim Down が前の質問で提案したように:

callback.call(this);

これが機能するのは、Apply/Call 呼び出しパターンを使用するとthis、必要な の値を選択できるためです。

于 2010-05-02T03:13:16.683 に答える
4

JavaScript では、thisキーワードは関数の所有者に設定されます。関数オブジェクトはそれ自体の所有権を維持しません。代わりに、関数を呼び出す方法から所有権が推測されます。

例えば:

var foo = function() {
    alert('hello');
};
var abc = {};
abc.bar = foo;

次のような関数を呼び出すだけです

foo();

関数がどのオブジェクトにアタッチされているかについて、インタプリタに手がかりを与えません。複数のオブジェクトにアタッチされている可能性があり、変数などである可能性があります。したがって、インタープリターthisはグローバルオブジェクトに設定します。

ただし、次のような関数を呼び出すと、

abc.bar();

インタープリターは、関数がabcオブジェクトに関連付けられていることを認識しているため、thisに設定されabcます。barと が同じ関数オブジェクトを参照していてもfoo、呼び出しパターンの違いによりthis動作が異なります。

于 2010-05-02T03:24:52.853 に答える