2016-06-30 2 views
3

Учитывая следующий код:thisArg из array.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

+2

Выражение функции стрелки имеет более короткий синтаксис по сравнению с функциональными выражениями и лексический связывает это значение (не связывает свой собственный, это аргументы, супер, или new.target) , Функции стрелок всегда анонимны. source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions –

+0

Он работает, если вы удаляете функцию стрелки https://jsfiddle.net/t9sbfv5a/ – brk

+0

@ НинаШолц, Каково решение? – Rayon

ответ

5

Проблема

Arrow functions:

стрелка выражение функции ч как более короткий синтаксис по сравнению с function expressions и лексически связывает значение this (не связывает его собственные this, arguments, super или new.target). Функции стрелок всегда равны anonymous.

Раствор 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

U зе укупорочного

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));

+0

Спасибо, полностью пропустил этот пункт о функциях стрелок. Поэтому в моем примере это относится к объекту, который охватывает цикл forEach. (Итак, это должен быть глобальный объект, который просто пуст?) – MMike

+0

'this' относится к объекту Windows. –

+2

Хорошо, я думаю, что в node.js нет объекта окна, может быть, потому, что он запускается на сервере, а не в браузере. Я нашел [this] (http://stackoverflow.com/questions/19849136/does-node-js-have-equivalent-to-window-object-in-browser), который гласит, что в node.js есть глобальный объект Object который ближе всего к объекту окна. :) На всякий случай вы заинтересованы. – MMike

Смежные вопросы