函數(shù)表達(dá)式跟函數(shù)聲明的區(qū)別

大家好,我是IT修真院武漢第10期學(xué)員,一枚正直、純潔、善良的前端程序員。

今天給大家分享一下,修真院官網(wǎng)任務(wù)js-2,深度思考的知識(shí)點(diǎn)——函數(shù)表達(dá)式跟函數(shù)聲明的區(qū)別;


1.背景介紹

? ??什么是 Function Declaration(函數(shù)聲明)?

Function Declaration 可以定義命名的函數(shù)變量,而無(wú)需給變量賦值。Function Declaration 是一種獨(dú)立的結(jié)構(gòu),不能嵌套在非功能模塊中??梢詫⑺惐葹?Variable Declaration(變量聲明)。就像 Variable Declaration 必須以“var”開(kāi)頭一樣,F(xiàn)unction Declaration 必須以“function”開(kāi)頭。

? ??什么是 Function Expression(函數(shù)表達(dá)式)?

Function Expression 將函數(shù)定義為表達(dá)式語(yǔ)句(通常是變量賦值)的一部分。通過(guò) Function Expression 定義的函數(shù)可以是命名的,也可以是匿名的。Function Expression 不能以“function”開(kāi)頭(下面自調(diào)用的例子要用括號(hào)將其括起來(lái))。



2.知識(shí)剖析

函數(shù)聲明實(shí)例
函數(shù)聲明實(shí)際執(zhí)行順序
函數(shù)表達(dá)式實(shí)際執(zhí)行順序
函數(shù)表達(dá)式實(shí)例? ? ? ? ? ??

? ? ? ? 函數(shù)表達(dá)式跟變量一樣,有一個(gè)var為頭的名字,后面跟一個(gè)匿名函數(shù),然后在后面調(diào)用這個(gè)變量名+()就可以調(diào)用這個(gè)函數(shù)了。在瀏覽器的渲染機(jī)制下,變量名get hoisted(被提升),賦值為undefined,然后瀏覽器再進(jìn)行賦值。但是后面的函數(shù)依然按實(shí)際順序執(zhí)行,所以后面的c為2的函數(shù)獲取不到了,因?yàn)楹瘮?shù)已經(jīng)return了;


3.常見(jiàn)問(wèn)題

????函數(shù)表達(dá)式創(chuàng)建的函數(shù)大多是匿名的。在代碼調(diào)試的時(shí)候比較麻煩;

4.解決方案

????建議使用 Named Function Expressions


?Named Function Expressions (命名函數(shù)表達(dá)式)?

5.編碼實(shí)戰(zhàn)

6.擴(kuò)展思考

????哪些地方不能用函數(shù)聲明?

????????????官方是禁止在非功能模塊(比如 if)中使用函數(shù)聲明的。但是所有瀏覽器都支持,但是各自的解釋方式不同。

7.參考文獻(xiàn)

????????????函數(shù)申明與函數(shù)表達(dá)式的區(qū)別

8.更多討論

詳情請(qǐng)看:

視頻鏈接

PPT鏈接

問(wèn):Function Expression 會(huì)被提升嗎?

答:這取決于表達(dá)式。

問(wèn):應(yīng)該注意什么?

答:官方是禁止在非功能模塊(比如 if)中使用 Function Declaration 的。但是所有瀏覽器都支持,但是各自的解釋方式不同。

問(wèn):還有其它理由支持 Function Expression 的嗎?

答:1)Function Declaration 感覺(jué)像是要模仿 Java 風(fēng)格的方法聲明,但是 Java 方法和 JavaScript 并不一樣。在 JavaScript 中,函數(shù)是含值的 living 對(duì)象。Java 方法僅是對(duì)元數(shù)據(jù)的存儲(chǔ)。下面的兩段代碼都定義了函數(shù),但是只有 Function Expression 看著像創(chuàng)建了對(duì)象。

2)Function Expression 用處更多。Function Declaration 只能作為“statement”孤立存在。它所能做的就是創(chuàng)建一個(gè)當(dāng)前作用域下的對(duì)象變量。相比之下,F(xiàn)unction Expression(根據(jù)定義)是大型結(jié)構(gòu)的一部分。如果想要?jiǎng)?chuàng)建匿名函數(shù)、給 prototype(原型)添加函數(shù)或是將函數(shù)用作其它對(duì)象的 property(屬性),都可以用 Function Expression。每當(dāng)用高階應(yīng)用,比如currycompose,創(chuàng)建新的函數(shù)時(shí)都是在用 Function Expression。Function Expression 和 Functional Programming(函數(shù)式編程)分不開(kāi)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容