2013-02-28 138 views
0

我很好奇,如何能更好地這樣寫:JavaScript的變量範圍在回調中

function Klass(variable) { 
    this.variable = variable; 

    this.callAjax = function() { 
     $.get('/url', { }, function(json) { 
      console.log(variable); //! <-- shows undefined 
     }, "json"); 
    } 
} 

所以我創建了一個局部變量:_variable

function Klass(variable) { 
    this.variable = variable; 

    this.callAjax = function() { 
     var _variable = this.variable; 
     $.get('/url', { }, function(json) { 
      console.log(_variable); //! <-- its ok 
     }, "json"); 
    } 
} 

和罰款,但我真不」 t這個解決方案,

是否有人有更好的代碼?

+2

'無功自我= this' – 2013-02-28 07:41:21

+0

'$獲得(...函數(){...}綁定(本)。)' – 2013-02-28 07:41:48

+0

我看不到爲什麼'console.log(variable);'應該顯示'undefined'。 'variables'應該引用構造函數的參數。你是否將'undefined'傳遞給構造函數並稍後設置'this.variable'? – 2013-02-28 07:47:10

回答

4

就是這樣。

function(json){console.log(_variable);} 

與「_variable」形成一個閉包。 「_variable」永遠保持原始值。

如果你的「變量」,應在稍後更新,並且要更新的「變量」 你定義

var self = this; 

,並呼籲self.variable得到它。

以這種方式,每次執行回調時都會得到更新的「變量」。

的完整代碼:

function Klass(variable) { 
    var self = this; 
    this.variable = variable; 
    this.callAjax = function() { 
     $.get('/url', { }, function(json) { 
      console.log(self.variable); 
     }, "json"); 
    } 
} 
+0

您也可以在構造函數中聲明'self',因爲'callAjax'是一個特權方法(在構造函數中聲明)。不過,你的方法比較好,因爲它也可以用於原型方法。 – 2013-02-28 07:50:14

+1

你說得對,我想知道爲什麼問題的第一個案例不起作用。它應該工作,只是變量不會改變。 – 2013-02-28 08:11:17