前面好像說過,js中沒有類似c#,java的文法區塊的概念。在for迴圈中定義的變數,離開了迴圈體後,仍然可以使用,如:
function outputNumbers(count){
for (var i=0; i < count; i++){
alert(i);
}
alert(i); //count
}
另外,就算在聲明一個變數,並且賦值後再聲明這個變數不會有任何問題,js會忽略重複的聲明
function outputNumbers(count){
for (var i=0; i < count; i++){
alert(i);
}
var i; //variable redeclared
alert(i); //count
}
c#和java中文法區塊的作用是用來控制變數的範圍,可js不能直接這樣使用,需要採取變通方法,如:
(function(){
//block code here
})();
函數的聲明被一對圓括弧包圍,因此js會認為圓括弧包圍的是運算式,同時運算式範圍內的變數是無法被外部參考的,因此可以類比出類似區塊的概念,如:
function outputNumbers(count)
{
(function ()
{
for (var i=0; i < count; i++)
{
alert(i);
}
})();
alert(i); //causes an error
}
匿名函數內部定義的變數當匿名函數執行結束便會銷毀,因此外部無法引用到,但是匿名函數能訪問count,因為匿名函數形成一個閉包。
使用這種方式的好處:
1.使用這種方式可以有效減少定義在全域上下文window內的對象,對於多人協作開發的頁面,可以減少命名衝突發生,每個開發人員可以使用他們喜歡的命名而不用擔心會汙染到全域上下文window
(function(){
var now = new Date();
if (now.getMonth() == 0 & & now.getDate() == 1){
alert(“Happy new year!”);
}
})();
2.此方式有效減少了閉包的記憶體問題,因為沒有指向匿名函數的引用了,因此匿名函數範圍鏈在函數執行完畢便銷毀。