У меня есть некоторые вызовы функции консоли Firebug, которые я хотел отключить, когда Firebug не был включен, например, консоль не определяется. Это хорошо работает в IE6 и FF3, но не в Chrome:
var log;
if(console){
log = console.log;
}else{
log = function(){ return; }
}
Я получаю "Непойманный TypeError: Недопустимый Вызов" в Chrome = /
Я читал о проблеме здесь, где необходимо применить контекст, который является видом плохо мне знакомых..., и я, может казаться, не изображаю, как выполнить вышеупомянутое во всех браузерах...
Да, вы должны сохранить контекст:
var log;
if (window.console && typeof console.log === "function"){
// use apply to preserve context and invocations with multiple arguments
log = function () { console.log.apply(console, arguments); };
} else {
log = function(){ return; }
}
Происходит то, что контекст (значение this
) неявно устанавливается при вызове функции, например:
var obj = {
method: function () { return this; }
};
obj.method() === obj; // true
В этом случае вы вызываете функцию, которая определена как свойство объекта, при вызове функции значение this
устанавливается на этот объект.
Теперь, как в вашем примере, если вы скопируете ссылку на этот метод в переменную:
var method = obj.method;
method() === window; // global object
Как видите, значение this
относится к глобальному объекту.
Итак, чтобы избежать этого неявного поведения, вы можете явно установить контекст с помощью функций call
или apply
.
Это не работает:
log("hi");
Хотя это работает:
log.call(console, "hi");
Очевидно, что вам нужно вызвать функцию с псевдонимом с правильным контекстом - - как вы сами отметили.
Я думаю, вам придется использовать оболочку функции (замыкание, которое имеет ссылку на исходный контекст), а не псевдоним ...
Также обратите внимание, что если вы проверите console
напрямую, вы можете получить ошибку времени выполнения, если переменная не существует. Вам лучше явно указать это как window.console
. Вот один из способов реализовать условную оболочку log
:
var log = (function (console) {
return console
? function () { console.log.apply(console, arguments); }
: function () {}
})(window.console);