2012-07-20 97 views
13

爲什麼我們不能在下面的例子中直接使用this而不是self爲什麼我們需要在Javascript中的類中使用「var self = this」?

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

後的反應,我已經學會:

是的,有沒有必要,如果有類沒有上下文切換。

但我會用這種方法作爲「約定」,雖然沒有必要。

回答

21

沒有理由,爲什麼你不能使用this直接出現(我會說這將是一個可讀性更好,如果你)。

然而,var self = this;往往需要在類似的情況下(基本上,像事件的任何異步操作結合,AJAX等處理,其中this分辨率推遲直到它等於別的東西);

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 2012-07-20 10:16:12

+0

@ozz:查看['window.setTimeout']的文檔(https://developer.mozilla.org/en/DOM/window.setTimeout);它會延遲提供的函數的執行時間,以指定的毫秒數。 – Matt 2012-07-20 10:17:45

+0

更不用說,setTimeout還允許你傳遞一個參數。即http://jsfiddle.net/gRoberts/rYB3f/,在您的示例中,它將刪除將'this'重新聲明爲'self'的需要。 – Gavin 2012-07-20 10:22:17

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 2012-07-20 10:25:39

+0

然而,您的權利很少,初學者很少學習原生JavaScript,他們傾向於搜索Google解決方案,這在大多數情況下會導致使用jQuery。這是一把雙刃劍。如果我已經給出了一個原生的JavaScript示例,那麼只知道基於jQuery的JavaScript的人會感到困惑。 – Gavin 2012-07-20 10:28:32

+0

JQuery IS本地JavaScript。儘管這不是本地DOM處理。混淆深刻。 – frostymarvelous 2016-04-26 06:20:07

5

在您的示例代碼沒有理由在所有this複製到一個變量。

它通常在代碼使用回調方法時使用。在回調方法this內部沒有引用該對象,因此您使用該變量。

相關問題