Как безопасно обернуть `console.log`?

Предположим, я хочу включить некоторые вызовы к 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 .

47
задан Community 23 May 2017 в 12:17
поделиться