В последнее время я пытался освежить свои основы JavaScript и понял, что мне было трудно объяснить основные различия между стрелочными функциями и обычными функциями ( объявления и выражения). Давайте посмотрим на некоторые ключевые отличия!
"Этот"
Обычные функции
Очень важное различие между стрелочными функциями и обычными функциями заключается в том, на что this ссылается при вызове функции. В обычной декларативной функции this будет указывать на глобальный объект (окно).
function example(){ console.log(this) } example() //=> logs the global object
Однако это в обычных функциях является динамическим. Если мы зарегистрируем это в console.log внутри функции метода, мы зарегистрируем объект, которому принадлежит метод.
const anotherExample = { exampleMethod() { console.log(this) } } anotherExample.exampleMethod() //=> logs anotherExample
Стрелочные функции
В стрелочных функциях this всегда указывает на значение внешней функции. Стрелочные функции выглядят лексически, и из-за этого они не определяют свой собственный контекст выполнения, который появится чуть позже.
const exObj = { exFunc() { console.log(this) //===> logs exObj const arrowFunc = () => { console.log(this) //===> logs exObj } } }
Конструкторы
Следует отметить одну очень важную вещь: стрелочные функции нельзя использовать в качестве конструктора. Это происходит из-за лексической области видимости, на которую мы только что ссылались. Если вы попытаетесь использовать стрелочную функцию в качестве конструктора, вы получите ошибку.
Подъем
Обычные функции поднимаются, когда они являются декларативными.
function name(string){ console.log(`My name is ${string}`) } //=> this will hoist
Однако функции как выражения не будут подниматься.
const name = function(string){ console.log(`My name is ${string}`) } //=> this will not be hoisted
А поскольку стрелочные функции всегда записываются в виде выражений, они никогда не поднимаются. Подробнее о подъеме смотрите здесь.
Я надеюсь, что это было полезно!