2011-11-14 7 views
1

は、次のコードを考えてみましょう:JavaScriptは - 参照「これは」内部機能に

MyClass.prototype.my_func = function() { 
    this.x = 10; 
    $.ajax({ 
     // ... 
     success: function (data) { 
      alert(this.x); 
     } 
    }); 
} 

明らかthisが閉鎖の実行コンテキストにバインドされていないので、それは、動作しません。私は別の変数を導入することでそれを回避することができました:

var _this = this; 

これは匿名関数の内部で動作します。しかし、私にはかなり醜い。これを処理する良い方法がありますか?

+9

あなたの提案した解決策、 'var _this = this;'は標準的な回避策だと思います。 – LukeH

+0

代わりに標準的な回避策は 'var that'を代わりに使用しています:P – hugomg

+0

@LukeH **解決策を呼び出さないようにしています** – ZenMaster

答えて

2

これはあなたのための醜い解決策のように見えますが、いくつかのウォークアラウンド(コンテキストを変更するためのusing bind() methodなど)がありますが、これは私が知っている最良の解決策です。

代わりに、あなたはそれを変更することができます。

var self = this; 

またはそれをより意味のある名前を付け、それはあなたがいつの日か、それを必要とするかもしれないとして、コンテキストを変更しない(この場合は)良いだろう。

1

あなたはそのためFunction.prototype.bindの利用を行うことができます。

MyClass.prototype.my_func = function() { 
    this.x = 10; 
    $.ajax({ 
     // ... 
     success: function (data) { 
      alert(this.x); 
     }.bind(this); 
    }); 
} 

は今、親コンテキスト変数は、匿名関数にバインドされています。

+0

私のために動作していないようですFF 3.6とIE8 –

+0

@Andy:これは非常に可能です。 '.bind()'はES5の仕様から新しくなっているので、古いブラウザではサポートされていない可能性があります。 – jAndy

+0

@Andy:私の答えでは、私は 'bind()'についてのMDN記事へのリンクと古いブラウザでの実装方法について説明しました。しかし、私は私の答えで言及したように、まだそれが行く方法ではないと思う。 – Tadeck

0

this構文は通常、関数のオブジェクトを指します。あなたの場合、thisMyClassを指します。

オブジェクト内の変数を使用している場合は、xMyClassに定義するのを忘れている可能性があります。

関数内で変数を使用している場合は、var構文を使用して変数を定義します。関数内で定義された変数は、関数が終了すると破棄されます。

MyClass.prototype.my_func = function() { 
    var x = 10; 

    $.ajax({ 
     // ... 
     success: function (data) { 
      alert(x); 
     } 
    }); 
} 
0

クロージャは、親のコンテキストで定義されたすべてのオブジェクトにアクセスできます。我々が持っているのであれば:

function() { 
    var x = 10; 
} 

を次にこれは有効です。そのため

function() { 
    var x = 10; 

    (function() { 
    alert(2*x); // 20 
    }()) 
} 

、あなたがvar _this = thisを定義するときに、単にクロージャ内で利用可能である親のコンテキストで新しい変数を定義しています。この「パターン」の詳細については、question #4371333を参照してください。

関連する問題