js中模仿塊級作用域
js中沒有塊級作用域的概念,例如:
function printNumber(num)
{
for(var i = 0; i < num; i ++ )
{
console.log(i);
}
alert(i);
}
在java、c++等語言中,變數只會在for迴圈內有定義,在for迴圈外是訪問不到的,但上面這段程式碼卻可以在js中正確的執行。
或許也可以在下面重新宣告同一個變數,遇到這種情況,它只會對後續宣告視而不見。
function printNumber(num)
{
for(var i = 0; i < num; i ++ )
{
console.log(i);
}
var i;
alert(i);
}
匿名函與數可以模仿塊級作用域並避免js沒有塊級作用域而導致的問題。
用塊級作用域(通常稱為私有作用域)的匿名函式的語法如下:
(function(){
//這裡是塊級作用域
})();
以上代 碼定義並立即呼叫了一個匿名函式,將函式宣告包含在一對圓括號中,它實際上是一個函式表示式。而緊隨其後的另一對圓括號會立即呼叫這個函式。
如果這樣定義
function(){
//這裡是塊級作用域
}();//出錯
因為js將function關鍵字作為一個函式宣告的開始,而函式聲明後不應該圓括號,要將函式函式宣告轉換成函式表示式只需給它外部加上圓括號即可;
(function(){
//這裡是塊級作用域
})();
無論在什麼地方,只要臨時需要一些變數就可以使用上面的私有作用域。
function printNumber(num)
{
(function(){
for(var i = 0; i < num; i ++ )
{
console.log(i);
}
})();
alert(i); //會導致錯誤
}
此時變數i只能在迴圈中使用,使用後即被銷燬。而num可以在私有作用域中被訪問,是因為匿名函式是一個閉包,它能夠訪問包含作用域中的所有變數。
一般來說,都應該儘量減少向全域性作用域中新增變數和函式,因為在專案開發中,一般過多的全域性變數容易引起命名衝突。在js中使用這種方法建立私有作用域每個開發人員即可以使用自己的變數,又不會擔心搞亂全域性變數。