3

this一部の Javascript オブジェクトでは、作成時にポインターが正しいことがわかります (これらはnew Func()-type オブジェクトです) が、割り当てられたメソッドでは間違っている可能性があります。

function Confused() {
   console.log("checking",this==window,"is always false");
   this.method = function() {
       console.log("checking",this==window,"is true for some funcs but not others");
   };
};

-へのいくつかの呼び出しで、ポインタ(new Confused()).method()が失われたようです。thisこれが発生する時間は、ランダムではなく関数に依存しているようです。これを引き起こしているクラスを作成する方法に関するコードの何か。

例はhttp://williame.github.com/barebones.js/でオンラインにあり、メンバーのコールバックは時々呼び出されるとG3D._file_loaded間違ったthisポインターを持ちます。

なぜ、どうすれば修正できますか?

4

3 に答える 3

7

Javascript で関数を使用する方法は 4 つあります。それぞれの機能は、の内容を変更することthisです。

  • 関数呼び出し: this = グローバル オブジェクト (ブラウザのウィンドウ)
  • メソッド呼び出し: this = 呼び出し元のオブジェクト。
  • コンストラクター呼び出し: this = 作成している新しいオブジェクト。
  • call/apply 呼び出し: this = あなたが渡したオブジェクト。

あなたの場合this == window、関数を直接呼び出す場合 ( Confused()) ですが、 new ( new Confused()) を使用して呼び出す場合は、作成している新しいオブジェクトになります。

于 2012-08-23T12:13:41.203 に答える
4

キーワードはthis、呼び出しコンテキストを参照します。それは決して間違いではありませんが、あなたが期待していたものではないかもしれません。

.callまたはで関数を呼び出すと、関数を呼び出すときにコンテキストを手動で設定できます.apply

さらに、 への参照が必要な場合は、代わりに?windowを使用してみませんか? これは、window オブジェクトにアクセスするためのより信頼性の高い方法です。windowthis

于 2012-08-23T12:07:37.173 に答える
2

David Hedlunds の説明に加えて、次のようにその問題を「回避」できます。

function Confused() {
   var that = this;
   console.log("checking",that==window,"is always false");
   this.method = function() {
       console.log("checking",that==window,"is always false");
   };
};

問題は、関数を実際に呼び出す人が関数のコンテキストを制御できることです。関数の呼び出しを制御しない場合 (つまり、コードを変更できない場合) は、私が提供した解決策に固執しています (少なくとも他の方法は知りません)。

解決策は少し「ハック」に見えますが、考えてみればそうではありません。クロージャーによって与えられた力を利用するだけです:D

于 2012-08-23T12:10:38.867 に答える