function bar() {
return foo;
foo = 10;
function foo() {}
var foo = 11;
}
console.log(typeof bar());
typeof bar kehrt Funktion ?! warum nicht nummer?
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = 11;
}
console.log(typeof bar());
typeof bar kehrt Funktion ?! warum nicht nummer?
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.
Warum funktioniert 'function bar() { zurück foo; foo = 10; foo = Funktion foo() {} var foo = 11; } console.log (typeof bar()); 'log' undefined'? – guest271314
@ 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
'kann nicht entscheiden, ob foo global oder lokal ist, wenn es nicht lokal ist, dann macht es global? –
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
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());
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 ... –
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.
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. –
Ich denke nicht, dass das richtig ist, 'var foo' wird überhaupt nicht behandelt. – georg
Okay, ich sehe ... aber denkst du sollte es sein: var foo; Funktion foo() {} Rückkehr foo; foo = 11; –
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());
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
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 **. –
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 –