Предположим, я хочу включить некоторые вызовы на console.log
по какой-то законной производственной причине, скажем, что-то вроде жгута модульного тестирования. Очевидно, я бы не хотел, чтобы это выдавало преждевременное исключение, если в браузере нет console
или если отсутствует консоль .
Какой лучший способ создать простую log
функцию для записи материалов на консоль или без вывода сообщений об ошибках, если консоли нет?
Принятый ответ на вопрос, указанный выше:
var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
Может ли эта log
функция нормально вызываться в IE, и использование apply
здесь просто для того, чтобы показать, что это возможно? И я предполагаю из связанного вопроса, что это потерпит неудачу, если консоль IE будет закрыта при запуске, поэтому log
не будет работать даже после открытия консоли, правильно? Если это не так, может кто-нибудь объяснить, как это работает?
Эта статья ycombinator представляется актуальной. Они говорят о том же поведении IE, что и вопрос, связанный выше?
Function.prototype.apply.apply(console.log, [console, arguments]);
Работает как на IE9 неработающий console.log, так и на обычном console.log других производителей.
Тот же хак, что и при использовании Array.prototype.slice для преобразования аргументов в реальный массив.
Это хорошо работает в моей хромированной консоли.
function echo(){
Function.prototype.apply.apply(console.log, [console, arguments]);
}
Упрощенная:
function echo(){
Function.apply.call(console.log, console, arguments);
}
Добавить чек и вернуть:
function echo(){
return window.console && console.log &&
Function.apply.call(console.log, console, arguments);
}
Пример выше выглядит адекватным для меня. У меня нет IE под рукой, чтобы проверить его, хотя. Это разумный подход для безопасной упаковки console.log
?
Дополнительные вопросы
Переходя по ссылке в ответе ниже, мы видим код:
Function.prototype.call.call(console.log, console,
Array.prototype.slice.call(arguments));
Какова цель преобразования arguments
в массив в этом случае? Я полагаю, что в каком-то браузере произойдет сбой, если вы этого не сделаете? И, кроме странного поведения оперы и браузеров без консоли, разве что-то подобное не должно работать в любом другом браузере? И служит ли prototype
цель в приведенных выше примерах, или мы просто педантичны ... Function.call.call
или Object.call.call
, или в этом отношении isNaN.call.call
, кажется, работает так же хорошо, как Function.prototype.call.call
.