2011-12-25 19 views
7

Próbuję uzyskać "ścisłe użycie"; dyrektywę do pracy i trochę kłopotów. W poniższym pliku FireFox 9 (poprawnie) wykryje, że someVar nie został zadeklarowany na linii 3, ale nie wykrył, że parametr Var nie został zadeklarowany w linii 19. Nie jestem pewien, dlaczego tak się stało.Dlaczego "używać ścisłego" (JavaScript) nie wykryje niezadeklarowanej zmiennej?

"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!"); 
    }); 

}); 

Odpowiedz

7

Musisz wywołać procedurę obsługi zanim błąd zostanie zgłoszony. Innymi słowy, kliknij #btnToClick.

Przykład skrzypce: http://jsfiddle.net/X3TQb/

+0

Jako senuote, za pomocą edytora, który jest w stanie analizować kod za pomocą linter będzie złapać te błędy czas edycji. Osobiście używam Sublime Text 2, który w połączeniu z SublimeLinter podkreśla błędy zgłoszone przez JSHint http://www.jshint.com/ –

+0

Orzechy! Przysięgam, że wypróbowałem to kilka razy i wcale nie otrzymałem żadnych błędów od Firebuga. Wróciłem i wypróbowałem to jeszcze raz i teraz robię błąd zgłaszany w konsoli Firebug (ale tylko po kliknięciu). JSLint zgłasza to w jednym przebiegu (tj. Bez oczekiwania na wywołanie metody). Dzięki! – MikeTheTall

+1

Możesz wskazać różnicę między analizą czasu przetwarzania i raportowaniem błędów wykonania w odpowiedzi. To jest tutaj kluczowa koncepcja. – wewals

1

Javascript jest trochę śmieszne, jeśli chodzi o zmiennym zakresie. Jeśli przed uruchomieniem tego kodu miałbyś uruchomić inny kod, możesz zadeklarować zmienne i nie wystąpiłby żaden błąd iz tego powodu trudno jest wyrzucać błędy dla brakujących zmiennych z wyjątkiem środowiska wykonawczego.