thisArg массива. forEach не ссылается, как ожидалось

Учитывая следующий код:

const theArray = ['Audi','Volvo','Mercedes'];

const myObj = {a: 7};

theArray.forEach((value, index, array) => {
    console.log(index + ' : ' + value);
    console.log(array === theArray);
    console.log(this.a);
}, myObj);

Я получаю следующий вывод:

0 : Audi
true
undefined
1 : Volvo
true
undefined
2 : Mercedes
true
undefined

Где я не понимаю, почему this не ссылается на myObj и возвращает undefined вместо 7. Хотя this typeof Object возвращает true, я не знаю, на какой объект он ссылается. Я просто знаю, что this возвращает пустой объект (т.е. {})

Версия интерпретатора Node.js — v6.2.1.

Версия двигателя V8 – 5.0.71.52.


person MMike    schedule 30.06.2016    source источник
comment
Выражение стрелочной функции имеет более короткий синтаксис по сравнению с функциональными выражениями и лексически связывает значение this (не связывает собственное значение this, arguments, super или new.target). Стрелочные функции всегда анонимны. источник: developer.mozilla.org/en-US/ документы/Интернет/JavaScript/Справочник/   -  person Nina Scholz    schedule 30.06.2016
comment
Это работает, если вы удаляете функцию стрелки jsfiddle.net/t9sbfv5a   -  person brk    schedule 30.06.2016
comment
@NinaScholz, какое решение?   -  person Rayon    schedule 30.06.2016
comment
Если вам нужно определить thisArg, вы должны использовать старый синтаксис function () {}.   -  person MrWillihog    schedule 30.06.2016
comment
Функция стрелки всегда лексически связана с this.   -  person Arnial    schedule 30.06.2016


Ответы (1)


Проблема

Функции стрелок:

Выражение функции стрелки имеет более короткий синтаксис по сравнению с функциональные выражения и лексически связывает this значение (не связывает собственное this, arguments, < a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super" rel="noreferrer">super или new.target). Стрелочные функции всегда анонимны.

Решение 1

Используйте function

const theArray = ['Audi','Volvo','Mercedes'];

const myObj = {a: 7};

theArray.forEach(function (value, index, array) {
    console.log(index + ' : ' + value);
    console.log(array === theArray);
    console.log(this.a);
}, myObj);

Решение 2

Используйте замыкание

var abc = 'abc';
const theArray = ['Audi','Volvo','Mercedes'];

const myObj = {a: 7};

theArray.forEach((obj => (value, index, array) => {
    console.log(index + ' : ' + value);
    console.log(array === theArray);
    console.log(obj.a);
    console.log(this.abc);
})(myObj));

person Nina Scholz    schedule 30.06.2016
comment
Спасибо, полностью упустил этот момент о функциях стрелок. Итак, в моем примере это относится к объекту, который заключает в себе цикл forEach. (Значит, это должен быть глобальный объект, который просто пуст?) - person MMike; 30.06.2016
comment
this относится к объекту Windows. - person Nina Scholz; 30.06.2016
comment
Хорошо, я думаю, что в node.js нет объекта окна, возможно, потому, что он работает на сервере, а не в браузере. Я нашел это, в котором говорится, что в узле .js есть глобальный объект, ближайший к оконному объекту. :) На всякий случай, если вам интересно. - person MMike; 30.06.2016
comment
@MMike Node.js заменяет window на process. Это действует как глобальный объект с функциональностью, аналогичной тому, что вы найдете в window в браузере. nodejs.org/api/process.html - person Christopher Ronning; 02.07.2016
comment
@ooronning process не является глобальным объектом, как window, global. process — это глобальная переменная/свойство global (и псевдонимов root и GLOBAL). - person Alexander O'Mara; 02.07.2016
comment
@ Александр О'Мара Ну тогда. Хе. Совершенно не знал, что process является собственностью global. Однако у меня сложилось впечатление, что process берет на себя больше функций window. Неверно? - person Christopher Ronning; 02.07.2016
comment
@ooronning В некотором смысле. Стандартные глобальные API JavaScript доступны через global. process содержит все расширения Node. Таким образом, вы можете подумать, что это похоже на document, но на самом деле это что-то свое. - person Alexander O'Mara; 02.07.2016
comment
@AlexanderO'Mara Спасибо за разъяснения. - person MMike; 02.07.2016