2012-04-01 12 views
0

ich den folgenden Code haben:JavaScript Verhalten Erklärung in Bezug auf eine var Erklärung

"use strict"; 

function isDefined(variable) 
{ 
    return (typeof (window[variable]) === "undefined") ? false : true; 
} 

try 
{ 
    isDefined(isTrue); 
} 
catch (ex) 
{ 
    var isTrue = false; 
} 

isTrue = true; 

Kann jemand mir bitte erklären, warum, wenn ich das Stichwort ‚var‘ entfernen erhalte ich eine ausgelöste Ausnahme, aber wenn es da ist es Leckereien es ist wie undefiniert?

+0

Zwei Dinge, die Sie vielleicht prüfen wollen: 'Rückkehr typeof Fenster [Variable] ==‚undefined‘,' ist genug, und die effektive Unterzeichnung IsDefined ist 'IsDefined (string) ', was' isDefined ('isTrue') 'bedeutet, um das Verhalten zu erhalten, das Sie zu erwarten scheinen (' window [undefined] ',' window [true] ') und' win dow [false] 'ergibt keinen Sinn). – Bergius

Antwort

3

Wenn Sie im strikten Modus arbeiten, dürfen Sie nicht auf Variablen zugreifen, die zuvor nicht deklariert wurden. So muss isTrue deklariert werden, bevor Sie darauf zugreifen können. Also, wenn Sie die var davor entfernen und es nirgendwo anders deklariert wird, wird das ein Fehler sein.

Zitiert aus dem MDN page on strict mode:

Zuerst Strict-Modus macht es unmöglich, aus Versehen auf globale Variablen zu erstellen. Bei normalem JavaScript wird eine Variable in einer Zuweisung falsch beschriftet erstellt eine neue Eigenschaft auf dem globalen Objekt und weiterhin " " arbeiten (obwohl zukünftige Fehler möglich ist: wahrscheinlich, in modernen JavaScript). Zuordnungen, die versehentlich globale Variablen statt throw im Strict-Modus schaffen würde:

Der Teil Ihrer Frage zu undefined ist ein wenig komplizierter. Aufgrund der variablen Hebe, wo eine variable Deklaration durch den Compiler an die Spitze des Anwendungsbereichs gehisst wird es erklärt, wird Ihr Code mit dem var Aussage entspricht dies:

var isTrue; 
try 
{ 
    isDefined(isTrue); 
} 
catch (ex) 
{ 
    isTrue = false; 
} 

isTrue = true; 

Wenn Sie also isDefined(isTrue) nennen, der Wert von isTrue ist undefined. Es wurde deklariert, aber nicht initialisiert, daher ist sein Wert undefined. Wenn Sie die var-Anweisung nicht haben, ist jeder Verweis auf isTrue im strikten Modus ein Fehler, da es noch nicht deklariert wurde.

Wenn Sie nur wissen wollen, ob eine Variable noch einen Wert hat, können Sie einfach tun:

if (typeof isTrue != "undefined") { 
    // whatever code here when it is defined 
} 

Oder, wenn Sie nur sicherstellen wollen, dass es einen Wert hat, wenn es nicht bereits initialisiert, können Sie dies tun:

if (typeof isTrue == "undefined") { 
    var isTrue = false; 
} 
+0

"Aufgrund des Variablen-Hochfahrens, bei dem eine Variablendeklaration vom Compiler an den Anfang des Bereichs gehängt wird, wird dieser deklariert"; Gilt dies für alle Browser, die ECMA5 berücksichtigen? Was passiert in alten Browsern mit diesem Code? –

+0

@RandallFlagg - Das Hochziehen war schon immer ein Teil von Javascript - es ist nicht neu bei ECMA5, daher verwenden alle Browser variable Hubs. Der Unterschied zum strikten Modus besteht darin, dass die Zuweisung zu einer nicht deklarierten Variablen ein Fehler ist, während in älteren Browsern nur automatisch eine globale Variable mit diesem Namen erstellt wird. – jfriend00