2012-09-07 14 views
5

po 'curioso di codice qui ...Perché questo avviso 5?

var x = 5; 

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

Ecco il jsFiddle

Is function x() {} chiamato a tutti dopo return? Perché non avvisare 10?

+1

Bizarre ... Se commentate la riga 'function x() ...', avvisa '10'. – Shmiddty

risposta

10

function x() {} è hoisted dell'inizio portata fn s', e questo rende efficace x una variabile locale prima viene valutata.

La funzione è non impostata su 10.

Aggiornamento: La frase sopra è errata. x è impostato su 10. var non è abituato a dichiararlo, ma anche se fosse, l'ultima frase nella citazione che segue si riferisce solo al dichiarazione parte del nome x, non la sua assegnazione-10.

Da MDN (sottolineatura mia):

funzione

Tre moduli con diverso comportamento portata:

  • dichiarato: come una dichiarazione in cima funzione di genitore -level
    • si comporta come una var vincolante che viene inizializzato a quella funzione
    • inizializzazione "paranchi" alla cima della funzione genitore, sopra vars

var

  • funzione-ambito
  • paranco per la parte superiore della sua funzione
  • redeclarations lo stesso nome nello stesso ambito sono gabbie
+1

Chiaro e informativo, grazie! –

+1

Intendi "precedere" invece di "sostituire"? Il 'x = 10' è ancora valutato e la funzione sovrascritta da' 10'. –

+1

@user, whoops, hai assolutamente ragione, ho preso in considerazione una parola chiave 'var' che non c'era. Grazie per l'heads-up, lo sistemerò subito. –

3

funzione x float all'inizio, in modo da assegnare la funzione di 10

0

Questo perché fn è un oggetto, e x è una proprietà di tale oggetto. L'ambito locale prende sempre la precisione sui globali.

+0

Questo è completamente sbagliato. 'X' non è una proprietà dell'oggetto funzione. –

+0

Sicuro, controlla questo violino: http://jsfiddle.net/f7tRR/5/ – Matthew

+0

In JavaScript c'è una chiara distinzione tra variabili e proprietà. Il 'x' definito dalla dichiarazione di funzione crea una variabile che non ha alcuna relazione diretta con l'oggetto' fn'. Un ambito variabile viene creato richiamando l'oggetto funzione, ma le variabili non diventano mai proprietà dell'oggetto. –

2

Si sta dichiarando la funzione x all'interno di fn; pertanto, stai utilizzando la versione locale di x. Non importa a che punto viene dichiarata la funzione x. Che cosa si sta effettivamente facendo quando si imposta x 10 è si sta impostando la funzione di x a 10.

2

This code Allerte anche 5:

var x = 5; 

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

Il punto importante è che si dichiara una variabile locale x. Dichiarando una variabile dopo anche l'estratto conto non ha importanza: è ancora una variabile locale.

Rimuovere la dichiarazione e si ottiene 10 perché la x non è più una variabile locale.

0

X nella fn() è una funzione ma x dell'area globale è una var

rimuovere la funzione x() {} parte e x saranno avvisati 10

1

Ciò è causato dal modo in cui il sollevamento variabile funziona in JavaScript. Le dichiarazioni variabili vengono issate, ma non i loro mandati. Le dichiarazioni di funzione vengono anche issate insieme al corpo della funzione (sebbene le espressioni di funzione non lo siano).

Quindi il codice è effettivamente facendo questo:

var x = 5; 

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

Il x all'interno della funzione è quindi dichiarata solo ambito locale e non influisce sulla x decalred nel codice principale.

Problemi correlati