JS 模仿塊級作用域
function outputNumbers(count) {
for (var i=0; i<count; i++) {
console.log(i);
}
var i; // 重新聲明變量
console.log(i); // 計數
}
上述中,重復聲明了i變量,但是JS從來不會告訴你是否多次聲明了同一變量;遇到這種情況,它只會對後續的聲明視而不見
不過,它會執行後續聲明中變量的初始化。匿名變量可以用來模仿塊級作用域並避免這個問題。
(function() {
// 這裏是塊級作用域(私有作用域)
}) ();
以上代碼定義並立即調用了一個匿名函數。將函數聲明包含在一對圓括號中,表明它是一個函數表達式。
function () {
//這裏是塊級作用域
}(); // 出錯
上述會出錯,因為JS將function關鍵字當作一個函數聲明的開始,而函數聲明後面不能跟圓括號。要將函數聲明轉化為函數表達式,只需要加一對圓括號
無論在什麽地方,只要臨時需要一些變量,就可以使用私有作用域。
function outputNumbers (count) {
(function () {
for (var i=0; i<count; i++) {
alert(i);
}
})(); // 是閉包,使用塊級作用域同時減少了閉包占用內存的問題,因為沒有指向匿名函數的引用,所以一旦執行完成就會被銷毀
alert(i); // 出錯
}
我們在for循環外部插入了一個私有作用域,在匿名函數中定義的任何變量,都會在執行結束時被銷毀。
因此,變量i只能在循環中使用,使用後即被銷毀。
而在私有作用域中可以訪問count,是因為這個匿名函數是一個閉包,它能夠訪問包含作用域中所有變量。
這種技術經常在全局作用域中被用在函數外部,從而限制向全局作用域中添加過多的變量和函數。
一般來說,我們都應該盡量少向全局作用域中添加變量和函數。
過多的全局變量和函數容易造成命名沖突
(function () {
var now = new Date();
if (now.getMonth() == 0 && now.getDate() == 1) {
alert(‘Happy New Year !‘);
}
})();
JS 模仿塊級作用域