Почему JavaScript не функционирует, искажая работу?

У меня есть некоторые вызовы функции консоли Firebug, которые я хотел отключить, когда Firebug не был включен, например, консоль не определяется. Это хорошо работает в IE6 и FF3, но не в Chrome:

var log;

if(console){
  log = console.log;
}else{
  log = function(){ return; }
}

Я получаю "Непойманный TypeError: Недопустимый Вызов" в Chrome = /

Я читал о проблеме здесь, где необходимо применить контекст, который является видом плохо мне знакомых..., и я, может казаться, не изображаю, как выполнить вышеупомянутое во всех браузерах...

21
задан Community 23 May 2017 в 10:33
поделиться

2 ответа

Да, вы должны сохранить контекст:

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 .

27
ответ дан 29 November 2019 в 20:55
поделиться

Это не работает:

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);
2
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: