JavaScript中選擇const申明函數還是直接用function

1. 基本形式

我們先來看看兩者的基本形式:

1.1 const聲明的函數:

const myFunction = function() {
  console.log('Hello World');
};

或者使用箭頭函數:

const myFunction = () => {
  console.log('Hello World');
};

1.2 function聲明的函數:

function myFunction() {
  console.log('Hello World');
}

2. 主要區別

2.1 作用域提升(Hoisting)

這是兩者最主要的區別之一。

  • function聲明:函數聲明是會被提升(hoisted)的。這意味著你可以在聲明函數之前調用它,編譯器會在執行代碼之前把函數聲明移動到作用域的頂部。

示例:

myFunction(); // 輸出 'Hello World'

function myFunction() {
  console.log('Hello World');
}

// 在這個例子中,盡管myFunction()是在函數聲明之前調用的,但由于提升,這段代碼仍然能正常工作。
  • const聲明: 使用const(或者let)聲明的函數不會提升。實際上,這種函數聲明會被視為變量聲明,而變量聲明只會被“聲明”提升,但賦值部分并不會提升。因此,在賦值完成之前使用這個函數會導致ReferenceError。

示例:

myFunction(); // ReferenceError: Cannot access 'myFunction' before initialization

const myFunction = function() {
  console.log('Hello World');
};

2.2 是否可以重新賦值

  • function聲明: 使用function聲明的函數可以在同一作用域內被重新定義。雖然這種做法并不常見,但在一些特定情況下可能發生。
function myFunction() {
  console.log('First function');
}

function myFunction() {
  console.log('Second function');
}

myFunction(); // 輸出 'Second function'
//在這個例子中,第二個函數聲明覆蓋了第一個。
  • const聲明: 使用const聲明的函數是不可重新賦值的。你不能再次給它賦值,否則會引發TypeError。
const myFunction = function() {
  console.log('First function');
};

myFunction = function() {
  console.log('Second function');
}; // TypeError: Assignment to constant variable.

2.3 箭頭函數 vs 傳統函數

在使用const時,你可以選擇使用箭頭函數(=>)來聲明函數,而function聲明只能使用傳統的函數語法。

  • 箭頭函數的this綁定: 箭頭函數中的this是詞法綁定的,意思是this取決于函數定義時所在的上下文環境,而不是調用時
const obj = {
  name: 'Object',
  traditionalFunction: function() {
    console.log(this.name); // 'Object'
  },
  arrowFunction: () => {
    console.log(this.name); // undefined,箭頭函數的 this 綁定到定義時的上下文
  }
};

obj.traditionalFunction(); // 輸出 'Object'
obj.arrowFunction(); // 輸出 undefined
// 這里,箭頭函數的this指向的是其定義時的上下文,而不是調用時的obj。

2.4 代碼風格和意圖

  • function聲明: 函數聲明通常用于定義獨立的函數邏輯。它清晰地表明這是一個函數,而不是變量賦值的結果。
  • const聲明: 使用const聲明函數通常表明這是一個不能重新賦值的函數表達式,在某些情況下,這可以防止意外重寫變量。此外,const還能更明確地告訴讀者這個函數不會被重新賦值,從而提高代碼的可讀性和安全性。

3. 實際使用建議

  • 函數提升: 如果你需要在函數聲明之前調用它,使用function聲明會更好,因為它支持函數提升,代碼更靈活。
  • 防止重新賦值: 如果你希望函數永遠不會被重新賦值或覆蓋,使用const會更安全,因為它限制了重新賦值的可能性。
  • 箭頭函數的優勢: 如果你更傾向于使用箭頭函數的簡潔語法,特別是在回調函數中(例如map、filter、forEach等方法),用const+箭頭函數組合會更方便。
  • 代碼風格和可讀性: 在許多團隊和代碼風格指南中,使用const聲明函數逐漸成為一種趨勢,因為它限制了重定義和提升帶來的潛在問題,代碼行為更加可預測。

4. 哪種方式更好?

  • 用const聲明函數時,你可以避免函數被重新賦值,代碼的可維護性會更高,特別是當你不希望函數被意外重寫時,const更加安全。
  • 用function聲明函數時,你可以享受函數提升的好處,使代碼看起來更靈活,適合在任何位置調用函數。

如果你不需要函數提升且想要更明確的代碼行為,那么使用const聲明函數可能是個更好的選擇。而如果你需要函數在定義前調用的特性或者是傳統習慣,那么function聲明也完全沒問題。

5. 相關鏈接

https://www.zhihu.com/question/512811173/answer/9980658748

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容