2016-03-30 12 views
1

Ich lerne Javascript selbst. Heute stieß ich auf ein Codebeispiel, das ziemlich verwirrend ist.Javascript Funktionsvariable sollte Fehler anstelle von undefined generieren

function fool(a, b){ 

    if(b) 
     var c = "Mary" 
    alert(c); 
} 

fool(1, true); //Returns "Mary" 
fool(1, false); //Returns undefined instead of error 

Auf der anderen Seite, wenn ich tun, um diese

function fool(a, b){ 

    //if(b) 
    // var c = "Mary" 
    alert(c); 
} 

fool(1, true); //Firebug error: ReferenceError: c is not defined 
fool(1, false); 

ist ein Fehler auf der ersten Chance auftritt. Wie ist das?

+3

Lesen Sie helfen über [_Variable hoisting_] (http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) – Rayon

Antwort

2

Unter Berufung auf MDN

var

Da Variablendeklarationen (und Erklärungen im Allgemeinen) Hissen verarbeitet werden, bevor ein Code ausgeführt wird, eine Variable überall deklarieren im Code entspricht der Deklaration oben. Dies bedeutet auch, dass eine Variable verwendet werden kann, bevor sie deklariert wird. Dieses Verhalten wird als "Hochziehen" bezeichnet, da die Variablendeklaration scheinbar an den Anfang der Funktion oder des globalen Codes verschoben wird.

Beispiel:

bla = 2 
var bla; 
// ... 

// is implicitly understood as: 

var bla; 
bla = 2; 

Für Ihren speziellen Fall:

// Your code 
function fool(a, b){ 
    if (b) 
     var c = "Mary" 
    alert(c); 
} 

// Equivalent code 
function fool(a, b){ 
    var c = undefined; 
    if (b) 
     c = "Mary"; 

    alert(c); 
} 

Als Randbemerkung, entwickelt Javascript.

Das let Schlüsselwort eingeführt wurde, die wie Sie arbeiten erwarten, aber in allen Browsern wird noch nicht unterstützt, so dass man sich nur verwenden, wenn Sie den JavaScript-VM (wie mit NodeJS, nw.js, ...) steuern

0

Sie haben die Variable 'c' kommentiert und versucht, sie anzuzeigen.Es wird Ihnen einen Fehler geben, da keine Variable als 'c' definiert ist.

Es gibt einen Tippfehler im Code.

versuchen diese

if(b){ 
    alert(c); 
} 
+0

Aber es gibt auch keine Erklärung für den ersten Code und 'Narr (1, falsch);' Berufung. Da 'b' falsch ist, tritt es nicht in den if-Block ein. – Marymon

0
function fool(a, b){ 

    if(b) 
     var c = "Mary" 
    alert(c); 
} 

fool(1, true); //Returns "Mary" 
fool(1, false); //Returns undefined instead of error 

Lasst uns brechen -

Sie den Aufruf einer Funktion, die b als false es geht an die if Schleife vorbei und betrachten nur erste Linie als Teil if und weiter nächste Zeile auszuführen, die alert(c) ist . Als b='false' so wird Marry dem c var zugewiesen. So, jetzt sind Sie alarmiert c die undefined als if wird nicht verarbeiten, bis es b als wahr im Funktionsparameter erhalten.

+0

Wenn etwas nicht definiert ist .. Es sollte 'Reference Error' geworfen werden – Rayon

+0

Weil' c' definiert ist, aber nicht ausgeführt? –

1

Dies ist, wie die JS-Engine Ihr erstes Beispiel neu anordnen werden:

function fool(a, b){ 
    // statement always executed, no matter what 
    var c; 

    if (b) 
     c = "Mary" 

    alert(c); 
} 

Unabhängig davon, ob die if-Anweisung ausgeführt wird oder nicht var c Anweisung bekommt hoisted an die Spitze des Funktionskörpers und damit in deklariert werden der aktuelle Funktionsumfang.

+0

immer ccuryl Klammern verwenden! – TEST

0

Es gibt zwei Dinge, die ich im Code bemerkt habe 1) Wenn Umfang: Wenn Sie nicht Klammer ({}) verwenden, wird es nur einen Satz unter If Block nehmen. Denn sonst wird der Interpreter erst wissen wann die Bedingung ist. So Code Sie die

if(b) 
     var c = "Mary" 
alert(c); 

ist, sollte wie seine

if(b){ 
     var c = "Mary" 
    alert(c); 
} 

wenn Sie alert (c) nur auf der, wenn die Bedingung wahr ausgeführt werden sollen.

2) Hochziehen: Jetzt zweite Frage ist auch wenn Ihre Bedingung falsch ist und der Satz nicht ausgeführt wird, wie es Warnung undefined der Grund ist variable hissen, die Variable Deklaration vor jeder Codeausführung ausgeführt wird. Also selbst wenn Sie Code tun wie

var k="something"; 

wird es erste k Variable wie

var k=undefined; 
k="something"; 

So in Ihr Code zuerst c erklären erklärt dann die Ausführung des Codes geschieht.

Ich hoffe, es

Verwandte Themen