今天落葉同學發我一篇文章,我看到一個"新"名詞 "函數字面量" (也可叫直接量),當時我就郁悶了,這是什么東西? 我怎么沒聽說過。。
回頭翻了下權威指南,在第 4.3 章節中可以看到:從某種意義上講,函數定義表達式可稱之為 "函數直接量"。
看樣子有必要重新仔細看看權威指南了,我已經發現好多細節問題都被忽略了。
不過在 函數字面量 定義的問題上,我們發生了一點分歧,他認為匿名函數叫做函數字面量才更准確,而我則認為,函數表達式即函數字面量。
於是我各種百度谷歌(百度這個狗屎,根本找不到這東西)。
其實我的習慣是去 MDN 找的,但是沒找到,所以無奈谷歌之。。
找到一個還算不錯的文檔: 4.2. Function Literal
我就不做翻譯了,簡單說下文章所表達的意思。
函數字面量由4部分組成。
第一部分,關鍵詞 function
第二部分,函數名,但是可有可無。
第三部分,包含在括號內的參數,當然參數也是可有可無的,括號不能少。
第四部分,是一組包裹在大括號的語句塊,也就是函數要執行的具體代碼,當然不寫代碼也沒問題,{} 是必須要的。
乍一看,這個不就是函數的定義么,怎么說是函數字面量呢?
其實,之前我們就說了一個限定條件,函數表達式。
當函數做為表達式的時候,可以分成這四部分。
第二部分,函數名,但是可有可無。
如果是函數聲明,少了函數名會報錯的。
所以說函數表達式才是這里所說的函數字面量。
例如
function () {}
這個寫法符合上面4條,但卻不是表達式,運行會報語法錯誤。
只有當作表達式的時候才能正常執行。
(function () {}); var a = function () {}; var obj = {fn: function () {}};
這樣寫都沒問題。。
再來看個
var fn = function test() {};
這個是函數聲明嗎?
這個也是函數字面量,test 是這個函數的名字,但是在這里只對函數體內可見,外部是不可調用的。
來看個測試 (點擊右側 運行 即可查看結果)
var fn = function test() { console.log(test); }; console.log(fn); fn(); console.log(test); // 報 test 未定義
這里的函數名可用於內部使用,比如一些遞歸調用的時候,這樣會很方便。
可能有人會說為什么不用 arguments.callee 呢。
很多地方都可以看到說 arguments 是把雙刃劍,是性能殺手,能避免就盡量避免使用。
加一個函數名,調用方便,性能極致,對項目壓縮也有好處,何樂而不為呢?
好了,今天的內容分享完畢,如有說的不對之處,還望回帖指教,小生先謝過了。。