2014-01-29 3 views
1

У меня вопрос newby в Javascript. Если я вызываю console.log (что-то) до того, как вызывается следующая функция MyInit (на простой странице html), я получаю исключение, потому что консоль не определена. Ничего страшного. Но я не вижу, что делает функция MyInit, чтобы заставить ее работать: похоже, что она определяет функцию журнала как нечто пустое, которое ничего не делает. Как это получается из определения, которое я предоставляю фактической функции журнала консоли, которая записывается в консоль?Определение консоли в Javascript

function MyInit() 
{ 
    if (!window.console) console = { log: function() { } }; 
} 
... 

<!-- later --> 

console.log("OnMouseOver occurred."); 

ответ

1

Чтобы сломать MyInit():

if (!window.console)   // If `window` does not have a `console` property 
    console = {    // Declare `console` object 
     log:     // Add `log` key 
      function() { } }; // ...which is a function which does nothing 

Что это будет сделать, это позволит console и console.log ссылаться без каких-либо ошибок броска. console.log("OnMouseOver occurred."); будет просто ничего не делать в браузерах, которые по умолчанию не поддерживают window.console.

Чтобы сделать это более ясно, я создал JSFiddle demo, который меняет этот метод. В этой демонстрации мы обнаруживаем, что window.consoleподдерживается, и если это мы установили override console.log, вместо этого сравним эту пустую функцию. Когда вы запустите это, вы увидите, что наш вызов console.log("Hello, world!") не записывает ничего на консоль, но в равной степени не вызывает никаких ошибок в том, что он не определен.

Короче говоря, MyInit() не сделать его работу, он просто создает console.log функцию, которая ничего не делает вообще.

+0

Правильно ли я здесь (сфера очень отличается от C++/C#): В globabl объеме, посмотрите на этих двух утверждений: (A), если window.console = (window.console!). (B) если (! Окно.console) консоль = . Это то же самое, потому что вторая версия устанавливает консоль в глобальную область, которая затем является членом окна. Но эта третья версия не работает: (C) if (! Console) console = . , потому что оператор if ссылается на неопределенную консольную переменную, прежде чем ему что-либо присвоено. Другими словами, я могу проверить член атрибута (window.console), но не неопределенную переменную. – Dean

Смежные вопросы