2011-12-25 2 views
7

Я пытаюсь получить «использование строгого»; директиву на работу и с небольшим количеством неприятностей. В следующем файле FireFox 9 (правильно) обнаружит, что someVar не был объявлен в строке 3, но не может обнаружить, что Var не был объявлен в строке 19. Я в тупике, почему это так.Почему «строго говоря» (JavaScript) не обнаруживает необъявленную переменную?

"use strict"; // this will cause the browser to check for errors more aggresively 

someVar = 10; // this DOES get caught // LINE 3 

// debugger; // this will cause FireBug to open at the bottom of the page/window 
     // it will also cause the debugger to stop at this line 

    // Yep, using jQuery & anonymous functions 
$(document).ready(function(){ 
    alert("document is done loading, but not (necessarily) the images!"); 

    $("#btnToClick").click(function() { 

     alert("About to stop"); 
     var aVariable = 1; 
     debugger; // stop here! 
     alert("post stop " + aVariable); 

     // this lacks a "var" declaration: 
     theVar = 10; // LINE 19 // this is NOT getting caught 

     // needs a closing " 
     // alert("hi); 
     console.log("Program is printing information to help the developer debug a problem!"); 
    }); 

}); 

ответ

7

Вам необходимо вызвать обработчик до того, как будет сброшена ошибка. Другими словами, нажмите #btnToClick.

Пример скрипка: http://jsfiddle.net/X3TQb/

+0

В качестве побочного элемента, используя редактор, который способен анализировать ваш код через linter, будет ловить эти ошибки время редактирования. Лично я использую Sublime Text 2, который в сочетании с SublimeLinter выделяет ошибки, о которых сообщает JSHint http://www.jshint.com/ –

+0

Орехи! Клянусь, я действительно пробовал это несколько раз и не получал никаких ошибок от Firebug вообще. Я вернулся и попробовал снова, и теперь я сообщаю об ошибке в консоли Firebug (но только при нажатии). JSLint сообщает об этом за один проход (т. Е. Не дожидаясь вызова метода). Спасибо! – MikeTheTall

+1

В ответе вы можете указать разницу между временем синтаксического анализа и временем выполнения. Вот ключевая концепция здесь. – wewals

1

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