Подтвердить что ты не робот

Функция ES6 arrow лексическая это в V8

У меня есть следующий код ES6 с использованием функции толстой стрелки:

var test = {
  firstname: 'David',
  fn: function() {
    return ['one', 'two', 'tree'].map(() => this.firstname)
  }
}
console.log(test.fn())

В соответствии с тем, как функции стрелок должны работать, я ожидаю, что this будет объектом test. ES6Fiddle, Traceur и Firefox производят ожидаемый результат, который равен ["David", "David", "David"].

При включении этих функций в Chrome с помощью chrome://flags/#enable-javascript-harmony, я получаю [undefined, undefined, undefined]. Если вы console.log(this), это показывает, что это объект окна, и вы получаете ошибку в строгом режиме. Является ли лексическая функция this для ES6 стрелки еще не реализована в V8?

4b9b3361

Ответ 1

Лексическая this - последняя часть функций стрелок ES6 для посадки в v8, и именно по этой причине она по-прежнему отстает от флага и еще не готова к отправке. Адриан Перес в Igalia реализует функции стрелок, и последний патч почти готов к приземлению, как только выработают несколько проблем TurboFan: https://codereview.chromium.org/883823002/

Ответ 2

Жирная стрелка является особенностью ES6. Он был введен в Firefox (Gecko), но еще не в других браузерах (и особенно не полностью в V8, что было бы интересно для разработки nodejs/iojs). Вот ссылка doc

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Browser_compatibility

В любом случае Если вам нужна привязка к сфере, вместо => используйте bind(). Вот простой пример.

Вместо этого.

$("#example").on("click", () => {
   // your code goes here
});

Используйте это.

$("#example").on("click", (function() {
   // your code goes here
}).bind(this));

Если вам не требуется привязка к области, просто сделайте это.

$("#example").on("click", function() {
   console.log("example");
});