zishu's blog

zishu's blog

一个热爱生活的博主。https://zishu.me

揭秘箭頭函式

英文地址: https://javascript.plainenglish.io/demystifying-javascript-arrow-functions-7b2a0908a2b3
通過掘金翻譯計劃活動進行翻譯

image

箭頭函數是函數表達式的替代方法,但在語法上有所不同,不能在所有情況下使用。如果您還沒有閱讀 JavaScript 中的函數表達式,我建議您在繼續閱讀之前先閱讀這篇文章

現在,讓我們試著從語法、執行、作用域和提升以及代碼示例方面來理解箭頭函數。

1. 語法#

const arrowFunctionSyntax = () => {
  console.log('Hi, I am an arrow function');
};
arrowFunctionSyntax();

在上面的代碼示例中,我們可以看到箭頭函數類似於函數表達式,因為它們被賦值為變量。 主要區別在於函數的編寫方式。 以下是我們可以根據其語法從上述代碼中得出的觀察結果:

  1. 它不包含 function 關鍵字。
  2. 它沒有 函數名 ,這意味著這些是匿名函數。
  3. 引入了箭頭 => 符號。
const arrowFunctionWithOneParam = (number) => number + 1;
const arrowFunctionWithMultipleParams = (numberOne, numberTwo) => {
  let sum = numberOne + numberTwo;
  return sum;
};
console.log(arrowFunctionWithOneParam(5));
console.log(arrowFunctionWithMultipleParams(5, 6));

如果我們同時觀察 arrowFunctionWithOneParamarrowFunctionWithMultipleParams,我們可以發現三者的不同 --- 括號 ()、塊 {}return 關鍵字的使用。 根據箭頭函數的語法,如果函數只接受一個參數,可以忽略括號()。如果函數只包含一條語句,則可以忽略塊{},最後其實也可以忽略return ,如果函數只包含一個語句。

2. 執行#

const arrowFunctionExecution = () => {
  console.log('Hi, my execution is similar to normal function');
};
arrowFunctionExecution();

在執行箭頭函數時,它們的執行方式與其他普通函數的執行方式相似。 當 JS 引擎執行 arrowFunctionExecution() 時,它會創建一個函數,執行上下文並被推送到調用堆棧。 一旦創建了執行上下文,它就會啟動創建階段。 在這個階段,它將創建參數對象並在其本地內存堆中聲明所有變量。

與普通函數相比,主要區別在於 this 的聲明。 箭頭函數沒有自己的 this 變量; this 在箭頭函數中使用時會得到詞法解析。 在創建階段之後不久,執行階段開始。 這時它開始執行語句 console.log() ,並將 "Hi, my execution is similar to normal function" 打印到控制台。

3. 作用域#

const arrowFunctionScope = () => {
  console.log('Hi, my scoping rules works similar to function expression');
};

這些函數遵循與其他函數表達式相同的作用域規則。這些函數有自己的作用域,函數內部聲明的任何變量都不能在函數外部訪問。 這些函數也不適用於 callapplybind 方法,這些方法通常依賴於作用域。 如果您還沒有閱讀過 JavaScript 中的作用域,我建議您閱讀 這篇文章

4. 提升#

amIGoingToBeHoisted();
var amIGoingToBeHoisted = () => {
  console.log('The answer is NO');
};

箭頭函數沒有被提升,因為它們也是函數表達式,其中函數被分配為變量的值。 當 JavaScript 引擎執行上述代碼時,在創建階段,聲明語句 var amIGoingToBeHoisted 將被移到頂部並使用值 undefined 進行初始化,而將初始值留在後面。 在執行階段,遇到語句amIGoingToBeHoisted 時會拋出類型錯誤,因為它的值是 undefined ,這不是提升後的函數類型。 要了解有關 JavaScript 提升的更多信息,我建議您閱讀 文章

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。