2016-08-02 4 views
1

В замечательной книге JavaScript Patterns Стоян Стефанов он приводит следующий пример как разовый обратного вызова:console.log выдает ошибку в Chrome и IE

document.addEventListener("click", console.log, false); 

В Chrome это Выдает Uncaught TypeError: Illegal invocation В Firefox он выбрасывает TypeError: 'log' called on an object that does not implement interface Console. В Safari он генерирует общий TypeError: Type error. Я не знаю, почему. Есть предположения?

ответ

3

консоль на самом деле объект и журнал() метод нуждается в области, чтобы получить доступ к этому объекту, например,

document.addEventListener("click", console.log.bind(console, "test"), false); 
+0

Это то же самое с моим ответом. снова посмотрите на вопрос. Dave kaye пытается использовать console.log в качестве параметра «console.log». Думаю, он не знает, что такое функциональное программирование? И он злится на мой ответ :) – Mehmet

+1

Как вы можете видеть, я прокомментировал вам сообщение, но данный пример был плохим, поэтому я добавил его. Вызов console.log внутри обработчика не совпадает с предоставлением необходимой области для метода. – Wolfgang

+0

Точно. И я ни о чем не сержусь, поверь мне. –

-1

console.log() - это функция! Таким образом, вы можете использовать это;

document.addEventListener("click", function(){ 
    console.log("test log"); 
}, false); 
+0

За исключением того, что нужно использовать console.log в качестве обратного вызова, а не запускать его в функции. –

+0

Вы не можете использовать обратный вызов, как это. Когда вы вызываете console.log, вы должны использовать console.log («bla bla») – Mehmet

+0

Книга очень хорошо написана. Я почти уверен, что автор не просто заставлял это путать людей. –

1

Это всегда помогает думать, что this есть.

Как вы звоните console.log, this не работает (и если вы в строгом режиме по умолчанию не установлены window). Тем не менее, функция ожидает this быть console, таким образом, давая «незаконное вызов» и «под названием на объекте, который не реализует интерфейс консоли» - вы в буквальном смысле называть его ни на чем (или окно)

Похоже код предназначен для console.log данных о событии, в этом случае вы должны явно сделать так:

document.addEventListener("click", function(e) {console.log(e);}, false); 

Обратите внимание, что, поскольку в настоящее время называется «нормально», this будет console, как ожидается, в браузере, и функционируют как предназначена.

Я бы рекомендовал изменить его на console.dir(e), чтобы вы могли реально исследовать данные объекта, потому что я полагаю, что [object PointerEvent] не очень полезен.

+0

Это очень близко к тому, что я считаю правильным. –

+1

лучший ответ: в качестве примера, чтобы это еще лучше: document.addEventListener («click», console.log.bind (console, «test»), false); – Wolfgang

+0

Это действительно правильный ответ. Сообщение как ответ Вольфганг, и я дам вам очки. –

0

Это потому, что console.log - это родной метод, и вы не можете ссылаться на него в другом контексте. Когда вы передаете его в качестве обратного вызова, вы в основном назначаете его в другом контексте. То же самое происходит, если вы сделаете следующее:

var foo = console.log; 
foo(1, 2, 3); 

Вот reference SO answer.