Chrome не распознает console.log, когда он называется log - PullRequest
4 голосов
/ 08 марта 2012

Как и все программисты, я ленивый.Так что в моем utils.js есть простая строка:

window.log = console.log

Это прекрасно работает в firefox , но заставляет Chrome плакать, как маленький мальчик.Я должен написать console.log, чтобы все заработало.

Есть предложения?

Ответы [ 2 ]

17 голосов
/ 08 марта 2012

Chrome console.log, очевидно, обращает внимание на то, что this, поэтому, если вы сделаете это:

window.log = console.log
log('pancakes')

Тогда вы не получите ничего, кроме исключения "TypeError: Illegal invocation" для ваших усилий,Однако, если вы принудительно зададите соответствующий контекст:

log.apply(console, 'pancakes')

, вы получите pancakes в консоли.Вот почему вам нужно обернуть console.log в функцию, если вы хотите быть ленивым и просто сказать log: некоторые реализации console.log необходимо вызывать с соответствующим контекстом.

Однако просто window.log = (x) -> console.log(x) не совсем корректно, поскольку console.log - это функция с переменным числом.Лучшей реализацией было бы это:

window.log = -> console.log.apply(console, arguments)

или педантично, поскольку arguments не является массивом и Function#apply ожидает массив, "cast" argumentsк реальному массиву обычным способом:

window.log = -> console.log.apply(console, Array::slice.call(arguments))

Это должно работать везде одинаково и сохранять вариативную природу console.log.Я сомневаюсь, что вам нужно быть таким педантичным, просто отправив arguments и притворившись, что это массив, должно быть в порядке.Вы также можете использовать CoffeeScript splats в качестве краткой формы [].slice и arguments вещи:

window.log = (args...) -> console.log(args...)

Если вы посмотрите на эту версию JavaScript, вы увидите, чтоэто замаскированный материал slice и arguments.

Конечно, если вы используете простой JavaScript, то один из них будет работать:

window.log = function() { console.log.apply(console, arguments) };
window.log = function() { console.log.apply(console, Array.prototype.slice.call(arguments)) };

Другой вариант -используйте Function#bind, чтобы заставить log вызываться в контексте console:

window.log = console.log.bind(console)

Недостатком является то, что не каждый браузер поддерживает bind.

1 голос
/ 08 марта 2012

Вы должны определить window.log как функцию, которая содержит console.log

window.log = function(x) { console.log(x); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...