大家好,我是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ù)表達(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

5.編碼實(shí)戰(zhàn)
6.擴(kuò)展思考
????哪些地方不能用函數(shù)聲明?
????????????官方是禁止在非功能模塊(比如 if)中使用函數(shù)聲明的。但是所有瀏覽器都支持,但是各自的解釋方式不同。
7.參考文獻(xiàn)
????????????函數(shù)申明與函數(shù)表達(dá)式的區(qū)別
8.更多討論
詳情請(qǐng)看:
問(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)用,比如curry或compose,創(chuàng)建新的函數(shù)時(shí)都是在用 Function Expression。Function Expression 和 Functional Programming(函數(shù)式編程)分不開(kāi)。