Мария Дминского
Добро пожаловать в часть II Узнайте ES6 Допочью, Серия, созданная, чтобы помочь вам легко понять ES6 (Ecmascript 6)!
Итак, черт возьми =>; ?
Вы, вероятно, видели эти странные египетские иероглифы здесь и там, особенно в чужом коде, где вы в настоящее время отлаживаете « » Это « » Проблема ключевых слов. После часа звонится, вы сейчас бросите в бару поиска Google и преследуете переполнение стека. Звучит знакомо?
Вместе, давайте покрывать три темы в Узнайте ES6 Допусший способ Часть II:
- Как « Это Ключевое слово относится к => Отказ
- Как мигрировать функции от ES5 до ES6.
- Важные причуды знать, что при использовании => Отказ
Функции стрелки
Функции со стрелками были созданы для упрощения функций и сделать использование « Это «Ключевое слово гораздо более просто. Они используют = & GT; Синтаксис, который выглядит как стрелка. Хотя я не думаю, что ему нужно пойти на диету, люди называют я т “толстый arr Оу «(и энтузиасты Ruby могут знать его лучше, как E» Hash Rock et “) – что нужно знать.
Как «это слово» относится к функциям стрелки
Перед тем, как мы погрузиться глубже в функции стрелки ES6, важно сначала иметь четкую картину того, что « Это «Становится в код ES5.
Если ‘ Это «Ключевое слово было внутри объекта Метод (Функция, которая принадлежит объекту), что бы она будет относиться?
// Test it here: https://jsfiddle.net/maasha/x7wz1686/
var bunny = {
name: 'Usagi',
showName: function() {
alert(this.name);
}
};
bunny.showName(); // UsagiВерный! Это будет относиться к объекту. Мы доберемся до чем позже.
Теперь, как насчет, если « Это Ключевое слово было внутри функции метода?
// Test it here: https://jsfiddle.net/maasha/z65c1znn/
var bunny = {
name: 'Usagi',
tasks: ['transform', 'eat cake', 'blow kisses'],
showTasks: function() {
this.tasks.forEach(function(task) {
alert(this.name + " wants to " + task);
});
}
};
bunny.showTasks();
// [object Window] wants to transform
// [object Window] wants to eat cake
// [object Window] wants to blow kisses
// please note, in jsfiddle the [object Window] is named 'result' within inner functions of methods.
Что ты получил? Подождите, что случилось с нашим кроликом …?
Ах, ты думал: « Это «относится к внутреннему функции метода?
Возможно, сам объект?
Вы мудрее думаете так, но это не так. Позвольте мне научить вас то, что когда-то научили кодировщики, которые когда-то научили меня:
Кодирование старшего : ” Ах да, T Хед код силен с этим. Действительно, практично подумать, что «это» ключевое слово связывается с функцией, но истина, «эта» теперь выпала сфера … теперь он принадлежит … », он делает паузу, как будто переживает внутреннюю суматоху , «Окно объект. “
Верно. Это именно то, как это произошло.
Почему ‘ Это «Связывание к окну объекта? Потому что ‘ Это «Всегда ссылаются на владелец функции, в котором он находится, для этого случая – поскольку он сейчас не имеет возможности – окно/глобальный объект.
Когда он находится внутри метода объекта – владелец функции является объектом. Таким образом, « Это «Ключевое слово связано с объектом. Тем не менее, когда он находится внутри функции, либо стоит в одиночку, либо внутри другого метода, он всегда будет ссылаться на окно/глобальный объект.
// Test it here: https://jsfiddle.net/maasha/g278gjtn/
var standAloneFunc = function(){
alert(this);
}
standAloneFunc(); // [object Window]Но почему…?
Это известно как javaScript quirk, что означает что-то, что просто происходит в JavaScript, который не совсем просты, и он не работает так, как вы думаете. Это также было расценено разработчиками как плохой выбор дизайна, который они сейчас устраняют функции стрелки ES6.
Прежде чем мы продолжим, важно знать о двух умных способах, которые программисты решают « » Это «Проблема в коде ES5, тем более, что вы будете продолжать работать в ES5 на некоторое время (не каждый браузер полностью мигрировал на ES6):
# 1 Создайте переменную вне внутренней функции метода. Теперь метод «Foreach» получает доступ к « Это И, следовательно, свойства объекта и их ценности. Это потому, что « Это «хранится в переменной, пока он все еще находится в пределах объема прямого метода объекта« Showtasks ».
// Test it here: https://jsfiddle.net/maasha/3mu5r6vg/
var bunny = {
name: 'Usagi',
tasks: ['transform', 'eat cake', 'blow kisses'],
showTasks: function() {
var _this = this;
this.tasks.forEach(function(task) {
alert(_this.name + " wants to " + task);
});
}
};
bunny.showTasks();
// Usagi wants to transform
// Usagi wants to eat cake
// Usagi wants to blow kisses# 2 Используйте связывание, чтобы прикрепить « Это «Ключевое слово, которое относится к способу внутренней функции метода.
// Test it here: https://jsfiddle.net/maasha/u8ybgwd5/
var bunny = {
name: 'Usagi',
tasks: ['transform', 'eat cake', 'blow kisses'],
showTasks: function() {
this.tasks.forEach(function(task) {
alert(this.name + " wants to " + task);
}.bind(this));
}
};
bunny.showTasks();
// Usagi wants to transform
// Usagi wants to eat cake
// Usagi wants to blow kissesИ теперь представляя … Функции стрелки! Работа с ‘ Это «Проблема никогда не была проще и простым! Простое решение ES6:
// Test it here: https://jsfiddle.net/maasha/che8m4c1/
var bunny = {
name: 'Usagi',
tasks: ['transform', 'eat cake', 'blow kisses'],
showTasks() {
this.tasks.forEach((task) => {
alert(this.name + " wants to " + task);
});
}
};
bunny.showTasks();
// Usagi wants to transform
// Usagi wants to eat cake
// Usagi wants to blow kissesВ то время как в ES5 ‘ Это «Относится к родителю функции, в ES6, функции стрелки используют лексическую область – ‘ Это «относится к этому нынешнему окрестностям и не дальше. Таким образом, внутренняя функция знала, чтобы привязать только к внутренней функции, а не к методу объекта или самой объекте.
Как мигрировать функции от ES5 до ES6.
// Before
let bunny = function(name) {
console.log("Usagi");
}
// After
let bunny = (name) => console.log("Usagi")
// Step 1: Remove the word 'function'.
let bunny = (name) {
console.log("Usagi");
}
// Step 2: If your code is less than a line, remove brackets and place on one line.
let bunny = (name) console.log("Usagi");
// Step 3. Add the hash rocket.
let bunny = (name) => console.log("Usagi");Ты сделал это! Отличная работа! Достаточно простого правильно? Вот еще несколько примеров, использующих жирную тощую стрелку скинни, чтобы ваши глаза привыкли:
// #1 ES6: if passing one argument you don't need to include parenthesis around parameter.
var kitty = name => name;
// same as ES5:
var kitty = function(name) {
return name;
};
// #2 ES6: no parameters example.
var add = () => 3 + 2;
// same as ES5:
var add = function() {
return 3 + 2;
};
// #3 ES6: if function consists of more than one line or is an object, include braces.
var objLiteral = age => ({ name: "Usagi", age: age });
// same as ES5:
var objLiteral = function(age) {
return {
name: "Usagi",
age: age
};
};
// #4 ES6: promises and callbacks.
asyncfn1().then(() => asyncfn2()).then(() => asyncfn3()).then(() => done());
// same as ES5:
asyncfn1().then(function() {
asyncfn2();
}).then(function() {
asyncfn3();
}).done(function() {
done();
});Важные причуды, чтобы быть в курсе при использовании функций стрелки
Если вы используете «новое» ключевое слово с функциями =>, он будет бросать ошибку. Функции стрелки не могут быть использованы в качестве конструктора – нормальные функции поддерживают «новый» через прототип свойств и внутренний метод [[Построить]]. Функции стрелки не используют ни один, поэтому новый (() => {}) бросает ошибку.
Дальнейшие причуды рассмотреть:
// Line breaks are not allowed and will throw a syntax error
let func1 = (x, y)
=> {
return x + y;
}; // SyntaxError
// But line breaks inside of a parameter definition is ok
let func6 = (
x,
y
) => {
return x + y;
}; // Works!
// If an expression is the body of an arrow function, you don't need braces:
asyncFunc.then(x => console.log(x));
// However, statements have to be put in braces:
asyncFunc.catch(x => { throw x });
// Arrow functions are always anonymous which means you can't just declare them as in ES5:
function squirrelLife() {
// play with squirrels, burrow for food, etc.
}
// Must be inside of a variable or object property to work properly:
let squirrelLife = () => {
// play with squirrels, burrow for food, etc.
// another super squirrel action.
}Поздравляю! Вы сделали это через Узнайте ES6 Допусший способ Часть II, и теперь у вас есть основание для знаний функций стрелки, лексические преимущества дает « Это «А также заверил себя какой-то навыки JavaScript quirk!:)
Держите свою мудрость обновляемой, понравив и следуя больше Узнайте ES6 Допусший способ Скоро придет к среднему!
Часть I: const, давай
Часть II: (стрелка) = > Функции и «это» ключевое слово
Часть III: Шаблонные литералы, распространение операторов и генераторы!
Часть IV: Параметры по умолчанию, деструктурное назначение и новый метод ES6!
Часть V: Классы, транспортировка ES6 Код и больше ресурсов!
Вы также можете найти меня на Github ❤ https://github.com/Mashadim
Оригинал: “https://www.freecodecamp.org/news/learn-es6-the-dope-way-part-ii-arrow-functions-and-the-this-keyword-381ac7a32881/”