函數表達式()()和函數聲明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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章