2017-02-24 1 views
9

Deklarieren Sie in JavaScript die Variable innerhalb einer Funktion, warum die Funktion die höhere Priorität erhält?

function bar() { 
 
     return foo; 
 
     foo = 10; 
 
     function foo() {} 
 
     var foo = 11; 
 
    } 
 
    console.log(typeof bar());

typeof bar kehrt Funktion ?! warum nicht nummer?

+1

Dieser Code ist ein Chaos ... Ich habe keine Ahnung, was Sie zu achiev versuchen. Der Grund, warum es Funktion zurückgibt, ist, weil Sie leere foo() - Funktion ohne Rückgabewert zurückgeben. ** Algorithmen arbeiten nacheinander, Funktionen werden jedoch nicht nacheinander deklariert **. –

+3

erinnere mich an 1 Regel, js Compiler verschiebe die Funktionsdeklaration in einem Kontext an der Spitze. Dieser Schlüssel wird alle Ihre Frage lösen –

Antwort

4

JS-Funktionen werden in zwei Durchgängen drei Durchgänge durchgeführt. Zuerst durchläuft der Motor den Code, sucht nach Funktionsdeklarationen und hebt sie an (= verschiebt sie nach oben), zweitens hebt er variable Deklarationen auf (es sei denn, der gleiche Name ist bereits gehisst), schließlich wird der "normalisierte" Code ausgeführt.

In Ihrem Schnipsel wählt der Motor function foo aus und verschiebt ihn an den Anfang der Funktion. Der nachfolgende var foo wird ignoriert.

Daraus ergibt sich die folgende "normalisiert" Code:

function bar() { 
    function foo() {} 
    return foo; 
    foo = 10; 
    foo = 11; 
} 

die Ergebnisse erklärt.

Referenz: Declaration Binding Instantiation, beachten Sie die Schritte 5 und 8.

+1

Warum funktioniert 'function bar() { zurück foo; foo = 10; foo = Funktion foo() {} var foo = 11; } console.log (typeof bar()); 'log' undefined'? – guest271314

+0

@ guest271314: danke, ich habe das Wort "Deklarationen" hinzugefügt: function _declarations_ werden zuerst gehisst. Ihre ist eine Definition, die nur ein gewöhnlicher Wert ist. – georg

+0

'kann nicht entscheiden, ob foo global oder lokal ist, wenn es nicht lokal ist, dann macht es global? –

3

return foo nur Verweise auf function foo() {} so ist es Function

function bar() { 
    return foo; // function foo() {} 
    foo = 10; 
    function foo() {} 
    var foo = 11; 
} 
alert(typeof bar()); // function 

ein anderes Szenario Rückkehr

function bar() { 
    return foo; // returns foo undefined as no value is assigned  
    foo = 10;   
    var foo = function() {} // referenced to variable 
    var foo = 11;  
} 

alert(typeof bar()) // undefined 

hier wird es diese Zahl

function bar() { 
    foo = 10; 
    return foo; // 10 
    function foo() {} 
    var foo = 11; 
} 
alert(typeof bar()); // number 10 

auch zurückkehren wird eine Verschlussfunktion zurück, die zurückgibt eine Nummer

function bar() { 
    foo = 10; 
    return function() { 
     return foo 
    } 
    var foo = 11; 
} 
alert(typeof bar()()); // number 10 
2

Sie vermasselt mit Rückkehr :).

Es geht nicht um die Priorität. Es geht um die Sache, die Sie zuletzt von der Funktion zurückkehren. Ändere sie und sieh zu. Du bekommst Nummer.

function bar() { 

    function foo() {} 
    var foo = 11; 
     return foo; 
    foo = 10; 
} 
alert(typeof bar()); 

This gives you number.

+0

Um darüber zu erweitern, denke ich, dass Sie auch in Konflikt mit einigen [hissen] (https://developer.mozilla.org/en-US/docs/Glossary/Hoisting), die die Sache kompliziert ... –

1

Der Grund für dieses Verhalten ist zu Hoisting in Javascript fällig.

Wenn Javascript interpretiert wird, wird jede Variable Definition zuerst verarbeitet, so im Rahmen Ihrer Funktion, die tatsächliche Reihenfolge des Aufrufs so etwas wie diese ist:

function bar { 
    var foo = 11; 
    function foo() {} 
    return foo; 
} 

Die Hebe Positionen die var foo = 11 Erklärung zuerst, und dann wird die foo durch die foo genannte Funktion überschrieben. daher gibt return foo die Funktion selbst zurück, nicht den numerischen Wert.

This is a good starting point to understand hoisting

+1

Ich denke, Sie sind größtenteils korrekt, aber die Variable _declaration_ wird gehisst, aber _nicht die Zuweisung_. Das ist der wahre Grund dafür, dass die 'typeof function' sich durchsetzt. –

+0

Ich denke nicht, dass das richtig ist, 'var foo' wird überhaupt nicht behandelt. – georg

+0

Okay, ich sehe ... aber denkst du sollte es sein: var foo; Funktion foo() {} Rückkehr foo; foo = 11; –

0

Funktion wird an die Spitze des aktuellen Bereichs Hochgezogen, damit Sie bei der Ausführung wie die von der Ausführung der Nummernvergabe return Anweisung verhindert

function bar() { 
    var foo; 
    function foo() {} 
    return foo; 
    foo = 10; 
    function foo() {} 
    foo = 11; 
} 
console.log(typeof bar()); 
1

aussehen würde kodieren, aber die Funktionsdeklaration kümmert sich nicht darum.

function bar() { 
    return foo; 
    foo = 10;   //assignment is never executed 
    function foo() {} //function definition happens even if code is not executed 
    var foo = 11;  //assignment is never executed 
    } 
console.log(typeof bar()); 

Um dies zu testen aus, kommentieren Sie die function foo() {} Linie. Sie werden sehen, dass bar()undefined zurückgibt. Die Zuweisungsanweisungen definieren foo, selbst wenn die Anweisungen nicht ausgeführt werden, aber sie überlappen den Wert von foo erst, wenn sie ausgeführt werden (wodurch die Funktionsdefinition bestehen bleibt).

Fiddle mit dem Code:
https://jsfiddle.net/vwm31faq

Verwandte Themen