2016-04-20 10 views
0

Ich fühle mich nur über ein Quiz verwirrt.Zwei Confusing Javascript Quiz

Quiz One

var x = 1; 
 
    if (function f(){}) { 
 
    x += typeof f; 
 
    } 
 
    alert(x);

Antwort:

Die Antwort für x "1undefined"

Verwirrung:

Was wirklich passiert ist "Funktion f() {}" in if-Bedingung?

Quiz Zwei

(function(x){ 
 
    delete x; 
 
    return x; 
 
    })(1);

Antwort:

Der Ausgang ist 1.

Verwirrung:

Warum funktioniert das Löschen nicht? Wann funktioniert 'löschen' und wann nicht?

Antwort

3

Der Punkt der Verwirrung auf # 1 ist, dass die Funktion als Funktionsausdruck gemacht wird. Die Funktion ist real (also übergibt sie die if-Anweisung als truthy), aber es ist keine Funktionsanweisung, daher wird keine externe f-Referenz dafür erstellt.

Es ist das gleiche Konzept wie wenn Sie einer Variablen eine Funktion zuweisen: Sie machen einen Funktionsausdruck.

var g = function(){}; 

die Funktion Ausdruck Naming nicht wirklich das ändern:

var g = function f(){}; 
// it would still only be externally accessible as g, not f 

es nur als f aus dem Inneren der Funktion zugänglich sind:

var g = function f(){ alert(f); }; 
g(); // will call the function, and from inside f will work 

Um f als Funktion zu machen Anweisung (anstelle von Ausdruck) müsste sie in ihrem aktuellen Umfang wie folgt definiert werden:

auch nur ein Zeichen in der Art und Weise, und es wird ein Ausdruck stattdessen ...

!function f() {} 
// now we can't :(

Für # 2, ganz einfach: Löschen ist für Objekteigenschaften. Wie zum Beispiel:

var obj = {}; 
obj.foo = 'bar'; 
delete obj.foo; 
alert(obj.hasOwnProperty('foo')); // <- false 
+0

Vielen Dank für diese hilfreiche Info! – Kelvin

5

Da jede Funktion wahr ist, haben Sie gerade eine Nummer 1 mit einer Zeichenfolge 'undefined' verbunden. Und in der zweiten funktioniert delete nur mit Objekteigenschaften.

+0

Vielen Dank für die Erklärung in Funktion booleschen Wert und löschen Stichwort – Kelvin

0

f ist nicht äquivalent zu f() Sie verwenden typeof für eine undefinierte Variable, die den String undefined zurückgibt, den Sie an x ​​anhängen.

Wie die vorherige Antwort angegeben. Delete entfernt Objekteigenschaften, löscht oder löscht keine Variablen.