Предположим, я хочу включить некоторые вызовы к console.log
по какой-то законной производственной причине, скажем, для чего-то вроде инструментария модульного тестирования. Очевидно, я бы не хотел, чтобы это приводило к преждевременному исключению, если в браузере нет консоли
или если консоль отсутствует .
Как лучше всего создать простую функцию log
, чтобы записывать данные на консоль или молча и без ошибок, если консоль отсутствует?
Принятый ответ на вопрос, указанный выше:
var log = Function.prototype.bind.call (console.log, console); log.apply (console, ["это", "is", "a", "test"]);
Может ли эта функция log
нормально вызываться в IE, и использование apply
здесь только для того, чтобы показать, что это возможно? И из связанного вопроса я предполагаю, что это не удастся, если консоль IE будет закрыта во время ее работы, поэтому log
не будет работать даже после открытия консоли, правильно? Если это не так, может кто-нибудь объяснить, как это работает?
Эта статья ycombinator кажется актуальной. Говорят ли они о том же поведении IE, что и указанный выше вопрос?
Function.prototype.apply.apply (console.log, [console, arguments]);
Работает как с поврежденным файлом console.log IE9, так и с обычным 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
в массив в этом случае? Думаю, в каком-то браузере он должен выйти из строя, если вы этого не сделаете? И, если не считать странное поведение Opera и браузеры без консоли, разве что-то подобное не должно работать и для всех других браузеров? И служит ли прототип
цели в приведенных выше примерах, или мы просто педантичны ... Function.call.call
или Object.call.call
или в этом отношении isNaN.call.call
, похоже, работает так же хорошо, как Function.prototype.call.call
.