1. 程式人生 > >函式表示式()()和函式宣告function的區別

函式表示式()()和函式宣告function的區別

區分函式表示式和函式宣告的區別在於function的位置,如果function不是出現在一段函式的第一個詞,那麼這是一個函式表示式,若function是第一個詞,則是一個函式宣告。函式宣告和函式表示式的區別有哪些呢?我們來看下面這一段程式碼:

var a = 2;
function test() {
    var a = 3;
    console.log(a);//3
}
test();
console.log(a); //2

這段程式碼聲明瞭一個一個test函式,在下面用test()呼叫了它,並且在函式內宣告的a變數也沒有汙染全域性變數,但是這裡還是有兩個問題,首先我們必須宣告一個test函式,這個test名稱本身就汙染了全域性變數,然後我們還需要顯式的呼叫test。我想,如果函式不需要函式名(至少函式名不去汙染全域性作用域),並且能夠自動執行,這樣會更加理想。

js中提供了能同時解決這兩個問題的方法,那就是使用函式表示式()(),前面的()用來包裹函式,後面的()用來執行函式,我們來看示例程式碼:

var a = 2;
(function test(){
	var a = 3;
	console.log(a); //3
})()
console.log(a); //2

函式宣告和函式表示式最重要的區別就是它們的名稱識別符號會被繫結在何處。我們比較一下這兩個程式碼片段,前一段程式碼將函式的名稱識別符號test繫結在所在的函式作用域中,而第二段程式碼中test繫結在函式表示式自身的函式中而不是全域性作用域中。也就是說(function test(){...})()意味著test只能在...這個位置被訪問到,在外部任何位置都訪問不到。test變數名被隱藏在了自身中而不去汙染全域性作用域,這一種非常理想的方法,其實我們常用的框架也是基於這種方法去實現,比如JQuery。