2016-07-24 4 views
0

In diesem Beispiel weiß ich, dass es undefined drucken wird.Javascript: Funktion hissen

var bar = typeof foo; 
var foo = function() { 
    console.log('abcd'); 
} 
foo(); 
console.log(bar); // -> undefined 

So verstehe ich, dass, wenn die Variablen hochgezogen werden, bar oben foo bleibt, aber foo wird ausgeführt, so sollte nicht der Dolmetscher wissen, was foo ist?

Hinweis: Ich versuche zu verstehen, wie der Interpreter funktioniert. Meine Frage ist nicht, wie man das obige Snippet repariert.

+3

'foo' wurde nicht ausgeführt, wenn' bar' ein Wert von 'typeof foo' zugewiesen wurde. Während des Hochziehens war der Wert von "foo" undefiniert. –

+0

Normalerweise ist es am besten zu vergessen, dass das Heben existiert. Es ist nur wirklich nützlich zu wissen, ob Ihre Funktionen der Lesbarkeit im Weg stehen und Sie sie zuletzt deklarieren wollen, aber Sie müssen sie mit einem benannten Funktionsausdruck deklarieren. – 4castle

Antwort

5

Wenn Sie die Variablendefinition Hebe Konto, ist der Code zu diesem äquivalent:

var bar; 
var foo; 

// foo does not yet have a value, so it it's still undefined 
bar = typeof foo; 

// foo gets a value here 
foo = function() { 
    console.log('abcd'); 
} 

// since foo got a value in the previous statement, you can now execute it here 
foo(); 
console.log(bar); 

Nur die Variablendefinitionen selbst hochgezogen werden, nicht die Zuordnungen.

So können Sie aus dieser Bestellung sehen, dass, wenn Sie ausführen bar = typeof foo dass foo hat noch einen Wert haben, so dass Sie damit undefined-bar zuweisen.


Funktionsdefinitionen wie:

function foo() { 
    console.log('abcd'); 
} 

sind auch gehisst, wenn Sie also foo wie folgt definiert, dann wäre es eine andere Geschichte sein. Die von Ihnen verwendete Funktionszuordnung wird jedoch nicht selbst ausgelöst. Die Art, wie Sie foo definieren, ist nur eine variable Zuweisung wie jede andere.

+0

Aber wie du sagst, foo bekommt seinen Wert auf die zweite Variablenzuweisung, bis zu dem Zeitpunkt, an dem "bar" in der letzten Zeile aufgerufen wird, sollte der Interpreter nicht wissen, was foo ist? – AlanH

+1

@AlanH - 'bar' enthält eine Kopie dessen, was' foo' zum Zeitpunkt der Aufgabe hatte. Sie können 'foo' nach Herzenslust ändern und' bar' ändert sich nicht. Es ist wie 'var y = 1; var x = y; y = 2; 'Der Wert von' x' hat sich nicht geändert, nur weil Sie 'y' zugewiesen haben. 'x' hat eine Kopie von allem was ursprünglich in' y' war. – jfriend00

+0

@AlanH - Siehe diese Antwort von früher am Tag: http://stackoverflow.com/questions/38538330/when-command-line-order-matters/38538444#38538444 – jfriend00