Я хотел сохранить свои операторы входа максимально короткими, препятствуя тому, чтобы консоль была получена доступ, когда она не существует; я предложил следующее решение:
var _ = {};
if (console) {
_.log = console.debug;
} else {
_.log = function() { }
}
Мне это кажется довольно изящным, и это работает отлично в Firefox 3.6 (включая сохранение номеров строки, которые делают console.debug
более полезный, чем console.log
). Но это не работает в Safari 4. [Обновление: Или в Chrome. Таким образом, проблема, кажется, различие между Firebug и консолью Webkit.], Если я следую за вышеупомянутым с
console.debug('A')
_.log('B');
первый оператор хорошо работает в обоих браузерах, но второе генерирует "TypeError: Введите Ошибку" в Safari. Это - просто различие между тем, как Firebug и Инструменты Веб-разработчика Safari реализуют консоль? Если так, это является ОЧЕНЬ раздражающим на части WebKit Apple. Привязка консольной функции к прототипу и затем инстанцированию, вместо того, чтобы связать его непосредственно с объектом, не помогает.
Я мог, конечно, просто звонить console.debug
из анонимной функции, присвоенной _.log
, но затем я потерял бы свои номера строки. Какие-либо другие идеи?
Во-первых, если консоль
действительно не определена (как в браузеры, такие как IE), вы получите сообщение об ошибке. Вместо этого вы должны проверить это как свойство глобального объекта, которым в браузерах является окно
. В целом также неплохо протестировать функцию перед ее использованием, поэтому я добавил тест для метода debug
.
Возможно, реализация console.debug
в Safari зависит от его значения , причем
является ссылкой на console
, чего не будет, если вы вызовите его, используя _. log
( this
вместо этого будет ссылкой на _
). Выполнив быстрый тест, похоже, что это действительно так, и следующее устраняет проблему:
var _ = {};
if (typeof window.console != "undefined"
&& typeof window.console.debug == "function") {
_.log = function() {
window.console.debug.apply(window.console, arguments);
}
} else {
_.log = function() { }
}