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
.