2012-09-07 9 views
5

Curious Stück Code ...Warum ist diese Warnung 5? hier

var x = 5; 

function fn() { 
    x = 10; 
    return; 
    function x() {} 
} 
fn(); 
alert(x); 

Hier ist die jsFiddle

function x() {} überhaupt nach return genannt wird? Warum nicht 10 warnen?

+1

Bizarr ... Wenn Sie die Zeile 'function x() ... 'auskommentieren, wird' 10 'angezeigt. – Shmiddty

Antwort

10

function x() {} ist hoisted zu Beginn des fn ‚s Umfang, und das macht effektiv x eine lokale Variable vor ausgewertet wird.

Die Funktion ist nicht eingestellt auf 10.

Aktualisierung: Der obige Satz ist falsch. x ist tatsächlich auf 10 festgelegt. var wird nicht verwendet, es zu erklären, aber selbst wenn es war, bezieht sich der letzte Satz in dem Zitat unten nur auf die Erklärung Teil des Namens x, nicht seine Zuordnung-10.

Von MDN (Hervorhebung von mir):

Funktion

Drei Formen mit unterschiedlichen Umfang Verhalten:

  • erklärt: als Anweisung an die Funktion Top-Mutter -level
    • verhält sich wie ein var Bindung, die auf diese Funktion
    • Initialisierung "Hubwerke" an die Spitze der übergeordneten Funktion initialisiert wird, oben Vars

var

  • Funktionsbereich
  • hissen an die Spitze seiner Funktion
  • redeclarations mit dem gleichen Namen im gleichen Umfang ist No-ops
+1

Klar und informativ, danke! –

+1

Meinst du "vorangehen" statt "ersetzen"? Das "x = 10" wird noch ausgewertet und die Funktion mit "10" überschrieben. –

+1

@user, hoppla, du hast absolut recht, ich habe ein "var" Keyword berücksichtigt, das nicht da war. Danke für das Heads-Up, ich werde das sofort beheben. –

3

Funktion x Schwimmer nach oben, so zuweisen Sie die Funktion 10

0

Dies liegt daran, fn ein Objekt ist, und x ist eine Eigenschaft des Objekts. Local-Scope nimmt immer die Genauigkeit über Globals.

+0

Das ist völlig falsch. Das 'x' ist keine Eigenschaft des Funktionsobjekts. –

+0

Sicher ist, überprüfen Sie diese Geige: http://jsfiddle.net/f7tRR/5/ – Matthew

+0

In JavaScript gibt es eine klare Unterscheidung zwischen Variablen und Eigenschaften. Das durch die Funktionsdeklaration definierte "x" erzeugt eine Variable, die keine direkte Beziehung zum 'fn'-Objekt hat. Ein Variablenbereich wird durch Aufrufen des Funktionsobjekts erstellt, aber die Variablen werden niemals Eigenschaften des Objekts. –

2

Sie deklarieren Funktion x innerhalb von Fn; Daher verwenden Sie die lokal begrenzte Version von x. Es spielt keine Rolle, an welchem ​​Punkt die Funktion x deklariert wird. Was machst du eigentlich, wenn man x auf 10 festgelegt ist, dass Sie die Funktion von x setzen bis 10.

2

This code auch Warnungen 5:

var x = 5; 

function fn() { 
    x = 10; 
    return; 
    var x; 
} 
fn(); 
alert(x);​ 

Der wichtige Punkt ist, dass Sie eine lokale Variable deklarierenx. Eine Variable nach deklarieren die Rückgabeanweisung ist auch egal - es ist immer noch eine lokale Variable.

Entfernen Sie die Deklaration und Sie erhalten stattdessen 10, weil x keine lokale Variable mehr ist.

0

X in fn() ist eine Funktion aber x im globalen Bereich ist ein var

die Funktion entfernen x() {} Teil und x wird alarmiert 10

1

Dies wird durch die Art und Weise verursacht, die Variable Hubarbeiten in JavaScript funktioniert. Variablendeklarationen werden gehisst, aber nicht ihre Aufgaben. Funktionsdeklarationen werden auch zusammen mit dem Funktionskörper hochgezogen (obwohl Funktionsausdrücke dies nicht sind).

So Ihr Code dies effektiv zu tun:

var x = 5; 

function fn() { 
    var x; 
    x = function() {} 
    x = 10; 
    return; 
} 
fn(); 
alert(x); 

Die x innerhalb der Funktion daher mit nur lokalem Bereich deklariert wird und keinen Einfluss auf die x im Hauptcode decalred.

Verwandte Themen