2015-03-10 2 views
0

вернуться к написанию JavaScript на некоторое время, я задаюсь вопросом, почему это не возможнопочему ты не можешь сделать [массив] .forEach (console.log)

[array].forEach(console.log) 
+0

что значение 'array' – chiliNUT

+0

Вы можете написать собственный прототип. http://code.tutsplus.com/tutorials/prototypes-in-javascript--net-24949 –

+1

Вы можете сделать это (только что сделал это в Firebug), если задан 'array'. Ты просто не возвращаешь то, что ожидаешь? Что вы ожидали? – talemyn

ответ

4

Он будет работать корректно в некоторых браузерах, а не в других.

Основная проблема путаницы в Javascript - это способ this ведет себя. Часто они будут производить значительно различное поведение:

myObj.method(); 

var a = myObj.method; 
a(); 

Что вы там делаете проходит console.log как функция в forEach, которая отделяет его от объекта он присоединен. Это приведет к любым применениям в методе log, чтобы ссылаться на неправильную вещь и, вполне возможно, привести к неправильной работе метода.

Чтобы исправить это, вы можете передать thisArg в .forEach:

[array].forEach(console.log, console); 

или использовать .bind():

[array].forEach(console.log.bind(console)); 
6

Поскольку console.log.bind(console), в противном случае .log() метод объекта console вызывается с неправильным контекстом.

Общее правило, которым следует следовать: метод должен быть вызван с надлежащим контекстом, если не указано иное.

Так что в этом конкретном случае никто не заявляет, что он может быть вызван с помощью undefined, поэтому вы не должны ожидать его работы. И даже если это так - вы не должны полагаться на это.

+0

спасибо, я всегда думал, что контекст предоставляется, если это метод для объекта. – user2167582

2

Вы можете, если браузер поддерживает его, хотя и тогда вы не должны полагайтесь на это.

Причина, по которой не работает на некоторых браузеров, что передавая функцию ссылки, как это (даже если эта функция является свойством объекта, такого как console) не устанавливает this контекст правильно в этой функции ,

Когда (браузер конкретного) осуществление функции log пытается получить доступ к его переменной this он находит, что вместо ссылки на console это на самом деле относится к глобальному объекту.

Чтобы исправить это, вы можете использовать это:

[array].forEach(console.log.bind(console)); 

где .bind вызов возвращает новую функцию оберточной первоначальную функцию и чей контекст установлен пройденному параметра (например, console)