вернуться к написанию JavaScript на некоторое время, я задаюсь вопросом, почему это не возможнопочему ты не можешь сделать [массив] .forEach (console.log)
[array].forEach(console.log)
вернуться к написанию JavaScript на некоторое время, я задаюсь вопросом, почему это не возможнопочему ты не можешь сделать [массив] .forEach (console.log)
[array].forEach(console.log)
Он будет работать корректно в некоторых браузерах, а не в других.
Основная проблема путаницы в 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));
Поскольку console.log.bind(console)
, в противном случае .log()
метод объекта console
вызывается с неправильным контекстом.
Общее правило, которым следует следовать: метод должен быть вызван с надлежащим контекстом, если не указано иное.
Так что в этом конкретном случае никто не заявляет, что он может быть вызван с помощью undefined
, поэтому вы не должны ожидать его работы. И даже если это так - вы не должны полагаться на это.
спасибо, я всегда думал, что контекст предоставляется, если это метод для объекта. – user2167582
Вы можете, если браузер поддерживает его, хотя и тогда вы не должны полагайтесь на это.
Причина, по которой не работает на некоторых браузеров, что передавая функцию ссылки, как это (даже если эта функция является свойством объекта, такого как console
) не устанавливает this
контекст правильно в этой функции ,
Когда (браузер конкретного) осуществление функции log
пытается получить доступ к его переменной this
он находит, что вместо ссылки на console
это на самом деле относится к глобальному объекту.
Чтобы исправить это, вы можете использовать это:
[array].forEach(console.log.bind(console));
где .bind
вызов возвращает новую функцию оберточной первоначальную функцию и чей контекст установлен пройденному параметра (например, console
)
что значение 'array' – chiliNUT
Вы можете написать собственный прототип. http://code.tutsplus.com/tutorials/prototypes-in-javascript--net-24949 –
Вы можете сделать это (только что сделал это в Firebug), если задан 'array'. Ты просто не возвращаешь то, что ожидаешь? Что вы ожидали? – talemyn