Рубрики
Без рубрики

Узнайте ES6 Часть доповка Часть II: Функции стрелки и «Это» ключевое слово

Мария Дминского Учиться ES6 Часть доповка Часть II: Функции стрелки и «это» ключевое слово «Это» к части II Узнайте ES6 Допочью, серия, созданная, чтобы помочь вам легко понять ES6 (Ecmascript 6)! Итак, черт возьми =>; ? Вы, наверное, видели эти странные египетские иероглифы

Мария Дминского

Добро пожаловать в часть 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/”