2012-07-20 13 views
13

次の例でselfの代わりにthisを直接使用できないのはなぜですか?応答の後Javascriptのクラスで "var self = this"が必要なのはなぜですか?

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 
} 

、私が学んだ:

をはい、クラスにはコンテキストスイッチがない場合は必要ありません。

しかし、私はこの手法を "慣習"として使用しますが、必要はありません。

答えて

21

あなたが直接そこthisを使用することはできません(と私はあなたをした場合、それが読みやすくするために良いだろうと言うでしょう)なぜ理由はありません。

しかし、var self = this;は、多くの場合、(それが何か他のものに等しくまでthisの解像度が延期されるイベントバインディング、AJAXハンドラなど、のような任意の非同期アクション、基本的には)次のような状況で必要とされています。

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 

    setTimeout(function() { 
     alert(self.name); // otherwise, this is window; use self to keep a reference to the "SeatReservation" instance. 
    }, 100); 
} 
+0

は、コンストラクタで実行setTimeoutをしていますか?それともクラスの方法ですか? – ozz

+0

@ozz:['window.setTimeout'](https://developer.mozilla.org/ja/DOM/window.setTimeout)のドキュメントを参照してください。提供された関数の実行を指定されたミリ秒数だけ遅延させます。 – Matt

+0

もちろん、setTimeoutではパラメータを渡すこともできます。すなわちhttp://jsfiddle.net/gRoberts/rYB3f/あなたの例では 'this'を' self'を再宣言する必要がなくなります。 – Gavin

3

あなたの例に基づいて、これを行う理由はありません。

しかし、それがあなたに役立つ状況はありますが、その一部は使用法に惑わされることがあります。上記で

すなわち

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       $(this).removeClass('busy'); 
      }, 
      error : function() 
      { 
       $(this).removeClass('busy');     
      } 
     }); 
    } 
}); 

スコープが失われているとして、成功とエラーコールバック内$(this)は、あなたがクリックしたリンクに反映されません。この問題を回避するには

、あなたのコード例でvar self = $(this)すなわち

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     var btn = $(this); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       btn.removeClass('busy'); 
      }, 
      error : function() 
      { 
       btn.removeClass('busy');     
      } 
     }); 
    } 
}); 
+5

あなたはもちろん、技術的に正しいですが、このような答えは私に少し迷惑です:** jQuery!= javascript **!jQueryの構文で広範なjavascriptの質問に答えると、初心者のために混乱するかもしれません。 – cypherabe

+0

しかし、初心者は初心者のjavascriptを習得することはほとんどありません。彼らはGoogleのソリューションを探す傾向があります。ほとんどの場合、jQueryが使用されます。それは両刃の剣です。ネイティブのjavascriptの例がある場合、jQueryベースのjavascriptしか知らない人は混乱するでしょう。 – Gavin

+0

JQueryはネイティブのJavaScriptです。 DOMのネイティブ処理ではありません。混乱は深い。 – frostymarvelous

5

を行うだろう変数にthisをコピーするために、すべての理由はありません。

通常、コードがコールバックメソッドを使用する場合に使用されます。コールバックメソッドthisの中でオブジェクトを参照していないので、その変数を使用します。

7

通常、コンテキストが変更されているときにこれを参照するために行われます。イベントハンドラやコールバック関数でよく使用されます。しかし、前述のように、あなたの特定の例でそれを使用する理由はありません。

次の記事で詳細を見つける:http://www.alistapart.com/articles/getoutbindingsituations

関連する問題