大家好科雳,我是IT修真院武漢第10期學員,一枚正直脓杉、純潔糟秘、善良的前端程序員。
今天給大家分享一下球散,修真院官網(wǎng)任務js-2尿赚,深度思考的知識點——函數(shù)表達式跟函數(shù)聲明的區(qū)別;
1.背景介紹
? ??什么是 Function Declaration(函數(shù)聲明)?
Function Declaration 可以定義命名的函數(shù)變量蕉堰,而無需給變量賦值凌净。Function Declaration 是一種獨立的結構,不能嵌套在非功能模塊中屋讶”埃可以將它類比為 Variable Declaration(變量聲明)。就像 Variable Declaration 必須以“var”開頭一樣皿渗,F(xiàn)unction Declaration 必須以“function”開頭斩芭。
? ??什么是 Function Expression(函數(shù)表達式)?
Function Expression 將函數(shù)定義為表達式語句(通常是變量賦值)的一部分羹奉。通過 Function Expression 定義的函數(shù)可以是命名的秒旋,也可以是匿名的。Function Expression 不能以“function”開頭(下面自調用的例子要用括號將其括起來)诀拭。
2.知識剖析
? ? ? ? 函數(shù)表達式跟變量一樣迁筛,有一個var為頭的名字,后面跟一個匿名函數(shù)耕挨,然后在后面調用這個變量名+()就可以調用這個函數(shù)了细卧。在瀏覽器的渲染機制下,變量名get hoisted(被提升)筒占,賦值為undefined贪庙,然后瀏覽器再進行賦值。但是后面的函數(shù)依然按實際順序執(zhí)行翰苫,所以后面的c為2的函數(shù)獲取不到了止邮,因為函數(shù)已經(jīng)return了;
3.常見問題
????函數(shù)表達式創(chuàng)建的函數(shù)大多是匿名的奏窑。在代碼調試的時候比較麻煩导披;
4.解決方案
????建議使用 Named Function Expressions
5.編碼實戰(zhàn)
6.擴展思考
????哪些地方不能用函數(shù)聲明?
????????????官方是禁止在非功能模塊(比如 if)中使用函數(shù)聲明的埃唯。但是所有瀏覽器都支持撩匕,但是各自的解釋方式不同。
7.參考文獻
????????????函數(shù)申明與函數(shù)表達式的區(qū)別
8.更多討論
詳情請看:
問:Function Expression 會被提升嗎墨叛?
答:這取決于表達式止毕。
問:應該注意什么模蜡?
答:官方是禁止在非功能模塊(比如 if)中使用 Function Declaration 的。但是所有瀏覽器都支持扁凛,但是各自的解釋方式不同忍疾。
問:還有其它理由支持 Function Expression 的嗎?
答:1)Function Declaration 感覺像是要模仿 Java 風格的方法聲明谨朝,但是 Java 方法和 JavaScript 并不一樣膝昆。在 JavaScript 中,函數(shù)是含值的 living 對象叠必。Java 方法僅是對元數(shù)據(jù)的存儲荚孵。下面的兩段代碼都定義了函數(shù),但是只有 Function Expression 看著像創(chuàng)建了對象纬朝。
2)Function Expression 用處更多收叶。Function Declaration 只能作為“statement”孤立存在。它所能做的就是創(chuàng)建一個當前作用域下的對象變量共苛。相比之下判没,F(xiàn)unction Expression(根據(jù)定義)是大型結構的一部分。如果想要創(chuàng)建匿名函數(shù)隅茎、給 prototype(原型)添加函數(shù)或是將函數(shù)用作其它對象的 property(屬性)澄峰,都可以用 Function Expression。每當用高階應用辟犀,比如curry或compose俏竞,創(chuàng)建新的函數(shù)時都是在用 Function Expression。Function Expression 和 Functional Programming(函數(shù)式編程)分不開堂竟。