函數聲明、函數表達式、匿名函數、立即執行函數詳解
定義函數的方式有三種:
1.函數聲明: function 函數名稱 (參數:可選) { 函數體 }
2.函數表達式: var express= function 函數名稱:可選 (參數:可選) { 函數體 }
3.構造函數: var fun =new Function(參數:可選);
最常用的是函數聲明和函數表達式。
推薦下我的前端群:121404239,不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,包括我自己整理的一份前端資料和零基礎入門教程,歡迎初學者和在進階中的小夥伴。
一:函數聲明
從上面的定義可以看出,函數聲明是以關鍵字function開頭聲明一個函數,然後必須具備一個函數名稱。
函數聲明有一個非常重要的特徵:函數聲明提升
,javascript引擎在解析代碼時,函數聲明將會被提升到當前作用域的頂部(跟變數提升非常類似)。正是因為這個特徵,所以可以把函數聲明放在調用它的語句後面。
Advertisements
如下例:
foo("hello"); //輸出 hello
function foo(name){
console.log(name);
}
二:函數表達式
從上面的定義可以看出,函數表達式是作為表達式語句的一部分存在;當它沒有函數名稱的時侯,則稱為匿名函數;
匿名函數:function ( 參數 ) { 函數體 } 匿名函數屬於函數表達式。
函數表達式與函數聲明的區別是:函數表達式必須等到Javascirtp引擎執行到它所在行時,才會從上而下一行一行地解析函數表達式,所以,調用它的語句不可以放在它之前。
如下例:
express(); //報錯,函數調用必須在函數表達式之後
console.log(express); //undefined 變數提升
Advertisements
var express=function () {
console.log("hello word!");
}
三:立即執行函數
先看幾個例子:
var express=function () {
console.log("hello word!");
}(); //運行,發現函數直接執行,結果輸出了"hello word!"
function () {
console.log("hello word!");
}(); //報錯 Uncaught SyntaxError: Unexpected token )
因為以function開頭,認為是函數聲明,結果沒有函數名,就報錯了
function foo() {
console.log("hello word!");
}(); //報錯 Uncaught SyntaxError: Unexpected token ) (注意:網上好多文章寫的不報錯,一看就沒有自己驗證過)
雖然,這個function在語法上沒問題,但是依然只是一個語句,加上括弧依然報錯,是因為語句中的分組操作符要包含表達式。
綜上,我們可以得到,在函數表達式後面緊跟一個小括弧(),函數會立即執行,兩大要點是:表達式、括弧();
所以,立即執行函數的寫法就是:
( function(){…} )() 或 ( function (){…} () )
這裡的括弧是消除歧義的,它告訴解析器,裡面的內容是表達式。
作者:lichunchun
原文:http://www.cnblogs.com/lichunyan/p/7894867.html