Javascript中的每個函數都有它自己的範圍。這意味着你用var關鍵字定義的每個變量只會在該函數中可用。這意味着當你撥打setFoo(10)
時,你創建了變量foo,給它一個5的值,之後它立即被銷燬,因爲它超出了範圍。
有多種方法可以解決這個問題。第一個是刪除var關鍵字。這將使foo進入全球範圍,這意味着它在任何地方都是可用的。然而,這是不鼓勵的,你想保持全局範圍儘可能的整潔,這樣如果你有多個人在同一頁面上提供javascript代碼,他們不能覆蓋其他人的變量。另一種方式來做到這一點會是這樣:
function setFoo(val){
var foo = val;
alertfoo = function(){
alert(foo)
}
}
在這個例子中,你在全球範圍內把唯一的事情就是alertfoo功能,因爲你想那是隨處可見。 alertfoo函數是在setFoo函數內定義的,這意味着儘管在執行setfoo之後foo應該已經超出了範圍,但它仍保存在內存中,因爲alertfoo可以訪問它。
這使得一些不錯的技巧。例如,假設您正在製作一個將包含在其他人頁面上的JavaScript庫,您將需要在其中創建一個可以定義變量的範圍,而不會污染全局範圍。執行此操作的最常見方法是聲明自動執行功能。這是被定義後立即執行的功能,它看起來像這樣:
(function(){
//set variables you want to be global in your own code
var mainpage = document.getElementById('main');
//define functions you want to make available to other people in a way that puts them in the global scope
setMainElement = function(newmain){mainpage = newmain;}
})();
可以使這甚至通過使只有一個對象的全球更好,並通過對象的方法提供您interfae,這樣,您將創建一個包含您的庫所包含的所有函數的名稱空間。下一個示例使用對象字面值來執行此操作。在JavaScript中,您可以通過在花括號中放置鍵/值對來創建對象。鍵/值對是對象的屬性。例如:
(function(){
var privatevar = 10,otherprivate=20;
publicInterface = {
'addToPrivate': function(x){privatevar+=x;},
'getPrivate': function(){return private}
};
})();
你到底明白了什麼?您是否嘗試過*將foo的聲明移到函數*之外? – 2011-12-14 12:30:32
嘗試此鏈接:https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope – 2011-12-14 12:33:32