2012-11-21 173 views
5

我試圖改變一個封閉一個變量的值內:更改全局變量的JavaScript關閉

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 

這不起作用,因爲myVariable不關閉可見。如何更改此代碼以使myVariable的值發生更改?

+1

這是不正確的。根據定義,如果它是全球性的,它可以在所有範圍內訪問。當然,如果有一個名爲'myVariable'的局部變量,那麼它將被修改而不是全局版本。如果它真的是全球性的,你可以使用'window.myVariable'來訪問它。 – mowwwalker

+1

您的示例不顯示爲什麼它在成功回調的範圍內不可見。唯一會隱藏它的就是在一個更近的範圍內存在一個具有相同名稱的變量,並將其遮蔽。 –

+0

嗯,我認爲這個變量沒有變,因爲ajax不是同步的。不知道如何使它同步,雖然 – user1811367

回答

11

相反,你的信念,你的代碼工作。但看到你想要做什麼,我猜你正在試圖做到這一點的字裏行間:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 
alert(myVariable); // at this point myVariable is undefined!! 

如果是這樣,你需要了解異步函數。

基本上,$.ajax()函數在實際提交ajax請求之前返回。稍後當瀏覽器不忙於執行javascript時,它會執行ajax請求。這意味着當您嘗試提醒myVariable的值時,分配不會發生。

這裏看我的反應更多的細節:JS global variable not being set on first iteration

唯一好的解決辦法是改變你對編碼的方式。 (有一種可以說是不好的解決方案,包括將ajax調用轉爲同步,但不要接近,你可以谷歌它,如果你想或閱讀手冊)。而不是這樣做:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 
/* 
* Do lots of stuff with the returned value 
* of the myVariable variable 
* 
*/ 

你現在需要把它寫這樣的:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
     /* 
     * Do lots of stuff with the returned value 
     * of the myVariable variable 
     * 
     */ 
    } 
}); 

基本上移動,你會在Ajax調用到成功回調後已撰寫的任何和所有代碼。這需要習慣(從互聯網上存在多少個這個問題的變體來判斷)。但一旦你習慣了它,它就成爲第二天性。

這種風格的編程有一個名稱。它有各種不同的名稱:「事件驅動編程」「延續傳球風格」「編程編程」。如果你想知道更多,你可以谷歌的各種條款。

+0

這可能會成爲問題的核心,儘管很難說明給出的解釋。 – tjameson

+0

@tjameson:根據我的經驗,無論什麼時候有人試圖將回調的結果賦值給一個封閉變量,那麼它很可能就是問題所在。回答關於這個問題足夠長的時間,你可以看到問題的模式。 – slebetman

3

如果該代碼在全局範圍內,myVariable 對內部函數可見。如果你擔心它被一個局部變量的陰影,明確地訪問它作爲全球的一個屬性:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     window.myVariable = data; 
    } 
});