在java、C++等語言中,for循環中的i變量只會在for循環的語句塊中有定義,循環一旦結束,變量i就會被銷燬。可是在js中,變量i是定義在outputNumbers()的活動對象中,因此一旦從它有定義開始,就可以在函數內部隨處訪問它。即使像下面這樣錯誤地重新聲明同一變量,也不會改變它的值。
function outputNumbers(count){
for(var i=0;i<count;i++){
alert(i);
}
var i;
alert(i);
}
無論在任何地方只要臨時需要一些變量,就可以使用私有作用域,例如:
function outputNumbers(count){
(function (){
for(var i;i<10;i++){
alert(i);
}
})();
alert(i);//導致一個錯誤
}
在重寫後的outputNummbers()函數中,我們在for循環外部插入了一個私有作用域。在匿名函數中定義的任何變量,都會在執行結束時被銷燬。因此,變量i只能在循環中使用,使用後即被銷燬。
這種技術經常在全局作用域中被調用在函數外部,從而限制向全局作用域中添加過多的變量和函數。一般來說,我們都應該儘量少向全局作用域添加變量和函數。在一個由很多開發人員共同參與的大型應用程序中,過多的使用全局變量和函數會導致命名衝突。而通過創建私用作用域,每個開發人員既可以使用的變量,又不必擔心搞亂全局作用域。