Функция 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?
Ответы
Ответ 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");
});