js拾遺: 函數字面量


今天落葉同學發我一篇文章,我看到一個"新"名詞 "函數字面量" (也可叫直接量),當時我就郁悶了,這是什么東西? 我怎么沒聽說過。。
回頭翻了下權威指南,在第 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 是把雙刃劍,是性能殺手,能避免就盡量避免使用。
加一個函數名,調用方便,性能極致,對項目壓縮也有好處,何樂而不為呢?

好了,今天的內容分享完畢,如有說的不對之處,還望回帖指教,小生先謝過了。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM