2010-02-25 16 views
2

我有一個問題,這個變量不想在功能外工作,我只是不明白爲什麼!下面的代碼:Javascript:如何使這個變種。全球工作

globalData = new Array(); 

// 
// Colors 
// 
if (settings.category == 'colors') { 
    $.getJSON(colorLoversURL, function(data) { 
    for (var i in data) { 
    var localData = data[i].hex; 
    globalData.push(localData); 
    } 
    }); 
} 

// 
// Palettes 
// 
else if (settings.category == 'palettes') { 
    $.getJSON(colorLoversURL, function(data) { 
    for (var i in data) { 
    var localData = new Array(); 
    for (var j in data[i].colors) { 
    localData.push(data[i].colors[j]); 
    } 
    globalData.push(localData); 
    } 
    }); 
} 

現在的事情是,全球國際會議只維持的getJSON函數內部和外部函數的值,當我需要它,它只是出現空白的(我在警報測試值窗口)。我也嘗試在代碼的前面和後面加上'var'。這裏有什麼不對嗎?

+1

這可能是一個愚蠢的問題,但是你什麼時候測試globalData是否有內容?如果它是上面的代碼後面的行,那麼響應很可能不會從您的回調中返回,但尚未填充它,並且仍然等於新的Array(); – Lindsay 2010-02-25 23:01:04

回答

5

你什麼時候檢查globalData?

這兩個調用getJSON都會使用回調操作globalData,因此在檢查globalData之前可能尚未調用該函數。別忘了你在那裏使用異步JavaScript。

如果是的話,我建議使用函數鏈

function useGlobalData() { 
    alert(globalData); 
    //do other stuff 
} 
// 
// Palettes 
// 

    $.getJSON(colorLoversURL, function(data) { 
    for (var i in data) { 
    var localData = new Array(); 
    for (var j in data[i].colors) { 
    localData.push(data[i].colors[j]); 
    } 
    globalData.push(localData); 
    useGlobalData(); 
    } 
    }); 
+0

異步JS如何影響這個? (它很容易關閉)我正在最後檢查全局數據。 – 2010-02-25 22:48:00

+0

發生了什麼事是函數$ .getJSON幾乎是即時返回的,並且在數據變爲可用之前不會調用函數(數據)。在等待數據到達的時候,你的代碼可能已經到達了打印globalData的地方 – 2010-02-25 22:51:26

+0

哇,我對AJAX來說很新,而且剛剛學習這個=)我結束代碼的是一個return語句 - 返回語句等待異步完成,或者關閉異步請求是最好的選擇? – 2010-02-25 22:53:28

0

如果它在您的.js文件中,那麼第一行必須是 var globalData = new Array();

,或者如果它裏面<script type="text/javascript">...</script>那麼你很下一行會

var globalData = new Array(); 

例如

<script type="text/javascript"> 
    var globalData = new Array(); 
    //Rest of JS code... 
    function whatever() { 

    } 
</script> 

然後globalData變成全局的。

0

這應該工作。有可能代碼運行兩次,導致globalData被重置爲空陣列?

-1

您正在javascript閉包內工作,並在閉包內部有一個明確的範圍。

這意味着只有在範圍內定義的東西才能被您訪問。

只是說x = something()不會創建一個全局變量(一個可以從所有範圍訪問的變量)。

要做到這一點,你需要做var x = something();

+1

在不使用var語句的情況下聲明變量使其成爲全局變量,除非它已經在當前範圍中定義;在這種情況下,它將覆蓋該值。 – Matt 2010-02-25 23:09:53