對不起,如果這已被回答,但我在這裏找不到合適的答案。模塊化Javascript中的變量範圍
我已經開始用模塊化風格編寫我的JavaScript代碼,並且我有一個關於模塊變量作用域的問題。
下面的代碼給了我一個相互衝突的答案。
我有一個名爲Base的模塊,聲明瞭兩個字符串和一個數組。它還有一個名爲fetchData的函數,它使用jQuery getJSON快捷方式將這些變量設置爲服務器數據。不幸的是,當我詢問Base的string1或string2時,我得到了未定義的。我知道這可能是由於我已經設置了深層的兩個函數(在AJAX回調和fetchData內)的值,並且該作用域限制它看不到Base.string1和Base.string2。
但是,當我從模塊外部查看Base.array1時,它將設置爲從服務器提取的適當數據,即使它的設置與字符串的範圍相同。
下面的代碼:
namespace.Base = (function(){
var string1, string2, array1 = [];
function fetchData(){
$.getJSON('backendScript.php', function(data){
string1 = data.string1;
string2 = data.string2;
arrayCount = data.arr.length;
for(var i = 0; i<arrayCount; i++){
array1[i] = data.arr[i];
}
})
}
return{
fetchData: fetchData,
string1: string1,
string2: string2,
array1: array1
}
})();
如果我改變
string1 = data.string1;
到
namespace.Base.string1 = data.string1;
它的工作原理是我想要的。
所以我的問題是,爲什麼array1的設置與字符串的範圍相同?
此外,在模塊的函數中設置模塊級變量而不必提供全局路徑(例如namespace.Base.string1)有什麼補救措施?
記住要給予好評*所有*答案這對你有幫助。檢查哪一個最能解答你的問題。如果沒有一個是「值得檢查」的,那麼只需對所有有幫助的答案進行upvotes。 – 2010-11-04 15:55:25
我是新來的,所以我會盡快獲得15點聲望。 – Dan 2010-11-05 00:46:58
嗯,好點。歡迎來到Stack Overflow。 – 2010-11-06 23:53:41