2013-03-01 17 views
1

在使用回調函數(例如AJAX調用)的內部函數時,它們在自己的環境中運行(this是窗口對象),並且在編寫它們的地方不知道this。我曾看到該2個解決方案:使用「self = this」和bind(this)用於內部函數之間是否存在顯着差異?

  • 使用selfthat
var Obj = function(){ 
    var a = 1; 

    var subFunc = function(){ 
     var self = this; 
     $.ajax({ 
      url: 'something.x', 
      success: function(data){alert(self);} 
     }); 
    } 

    return { 
     subtract : subFunc 
    } 
}; 

var o = new Obj(); 
o.substract(); 
  • 使用bind命令(通過自動裝箱的self變量完成):(我不知道這是怎麼完成的)
var Obj = function(){ 
    var a = 1; 

    var subFunc = function(){ 
     $.ajax({ 
      url: 'something.x', 
      success: function(data){alert(this);}.bind(this) 
     }); 
    } 

    return { 
     subtract : subFunc 
    } 
}; 

var o = new Obj(); 
o.substract(); 

解釋者實際開始解釋時有什麼不同?這對性能有什麼影響?

+0

你有沒有試過[benchmark](http://jsperf.com/)呢? – VisioN 2013-03-01 09:14:19

+0

你不應該調用'.bind(self)'而不是'.bind(this)'嗎? – 2013-03-01 09:17:08

+0

@JakubKonecki不,我想它應該是'this',因爲它在對象字面值內調用,而不是在函數中調用。 – VisioN 2013-03-01 09:23:56

回答

3

綁定通常由有經驗的JS開發人員(至少在我工作的地方)首選。

JavaScript範圍很難理解,因爲定義一個新函數時,「this」不包含在閉包中。它可能會讓你想放棄,只是創建一個新的局部變量來指向它,但是如果你這樣做,你會限制自己。

綁定的優點是,一旦您習慣了它,就是您始終如一地使用該語言。

你在JS中寫了很多類嗎?一旦你習慣了綁定,你知道爲什麼在一個對象上調用一個函數不同於將該函數設置爲局部變量然後調用它,因爲你總是在考慮範圍。你總是知道「這個」來自哪裏,因爲你聲明瞭它。

你也避免了聲明和讀取重複「自我」和「那個」變量混淆你的代碼庫的煩惱。

綁定的缺點是它一般不可用。但是爲它編寫一個polyfill是非常有教育意義的(或者只是在網上找到一個),然後你再也不用擔心它了!

我懷疑這兩種方式都有性能影響。當然不是典型的日常使用。

1

最近朋友向我指出了使用var self vs .bind()的一個好處。

對於埃克:

function() { 
    var self = this; 

    $('selector').map(function() { 
    this.attr('href'); 

    self.doThis(); 
    }); 
} 

這樣,您就可以使用兩個this範圍。我同意另一個答案,它可以使事情混亂,但我認爲它有它的位置。

繼承人a benchmark 幾乎沒有差別。再一次,它是一個非常簡單的測試。

0

如果你最終沒有使用綁定,我會建議使用that而不是self

這是因爲self是一個有效的全局變量(在window.self)。 我曾經給我的作用域命名爲self,有一天我忘了var self = this這一行......這並不像您預期​​的那樣容易調試。我現在使用thatme,或者更經常使用綁定。

相關問題