Предположим, что я хочу включить некоторые вызовы в console.log
для какой-либо законной причины производства, скажем, для чего-то вроде жгута unit test. Очевидно, я бы не хотел, чтобы это порождало преждевременное исключение, если в браузере отсутствует консоль 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, так и на обычной консоли .log от других поставщиков. Такой же взлом, как использование Array.prototype.slice для преобразования аргументов в реальный массив.
Это хорошо работает на моей консоли Chrome.
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
.