2010-03-26 7 views
10

Beim Erstellen von JavaScript mit ASP.NET MVC habe ich mehrere Bereichswarnungen bemerkt und festgestellt, dass mir etwas fehlt, wenn ich den Variablenbereich in der switch/case-Anweisung verstehe.Was ist der JavaScript-Variablenbereich in einer switch/case-Anweisung?

Warnung: 'i' ist bereits definiert zu Fall b und Fall Bezug c

Mein Code in etwa so aussieht:

switch(element) { 
    case 'a': 
    for(var i=0; i < count; i++){ 
    do something 
    } 
    break; 

    case 'b': 
    for(var i=0; i < count; i++){ 
    do something 
    } 
    break; 

    case 'c': 
    for(var i=0; i < count; i++){ 
    do something 
    } 
    break; 
} 

Ich dachte Umfang mit jeder break-Anweisung beendet, aber es scheint dieser Umfang endet nicht vor dem Ende des Schalters/Falles. Gibt es Spielraum für den gesamten Schalter/Fall?

Antwort

15

Javascript verwendet keinen Blockbereich.

Daher sind alle lokalen Variablen in der gesamten Funktion enthalten, in der sie deklariert wurden.

Allerdings gibt es in Ihrem speziellen Fall keine C-ähnliche Sprache (die ich kenne), in der jede case Anweisung einen unabhängigen Bereich bildet.
Zum Beispiel wird das folgende C# -Code nicht kompilieren:

switch(someVar) { 
    case 1: 
     int a; 
     break; 
    case 2: 
     int a;  //'a' is already defined 
     break; 
} 
+0

Ja. Ich muss hier einschlafen, weil es auf den ersten Blick richtig schien. Aber Freude an Compilerwarnungen, um mich wissen zu lassen, wenn ich eingeschlafen bin. Danke für die tolle Antwort. –

+3

Beachten Sie, dass Sie in C-ähnlichen Sprachen (nicht Javascript) nach dem Fall einen Bereich selbst erstellen können, wenn Sie möchten: 'Fall 1: {...} ' – hugomg

+0

FYI, heutzutage ES6-Syntax erlaubt Block-Scoping, so dass Umfang nach Fall wäre möglich –

0

Selbst wenn Javascript Block Umfang hatte, da der Durchfall Funktion ist, die irgendwie den Begriff pro case einen Umfang von mit disqualifiziert ...

4

Gibt es Spielraum für den gesamten Schalter/Gehäuse?

Nein, es ist für die gesamte enthaltende Funktion oder den globalen Bereich, wenn Sie außerhalb einer Funktion sind.

(Es gibt ein Unbekannter wenige Fälle, in denen JavaScript zusätzlichen Spielraum führt, aber das war es.)

Warnung: 'i' definiert bereits

ich wirklich nicht einverstanden mit dieser Warnung. Ich würde es vorziehen, den Code so zu belassen, wie er ist, mit den unabhängigen Verwendungen der Blöcke der Variablen i.

Was es will, dass Sie tun ist, um die var von allen außer der ersten Erklärung zu entfernen, oder vielleicht var i vor dem Schalter hinzufügen und entfernen var aus allen for s. Aber jetzt stehen diese Blöcke nicht allein, und ein schnelles Ausschneiden und Einfügen (z. B. Refactoring der switch in separate function s) lässt Sie Schleifen mit Bezug auf eine i, die nicht var deklariert wurde. Dies ist ein zufälliges globales und es ist eine schreckliche JS-Falle, die beim Debuggen sehr schmerzhaft sein kann.

JSLint macht die gleiche Beschwerde. Ich würde es normalerweise ignorieren. Es ist nicht schädlich, eine Variable var zweimal in einem Block zu deklarieren.

+0

Ja, ich weiß, es funktioniert. Ich habe einfach keine Warnungen im Produktionscode. Aber ein Gespräch hier im Büro darüber ergab, dass jQuery das Gleiche macht. Also kann ich es verlassen. Danke für die gute Antwort. –

Verwandte Themen