2012-03-17 2 views
3

considèrent ces légèrement deux versions différentes de levage ...Confus au sujet de levage

mylocation = "dublin" 
function outputPosition() { 
    alert(mylocation); 
    mylocation = "fingal" ; 
    alert(mylocation); 
} 
outputPosition(); 

Affichera "Fingal" puis "Fingal"

mylocation = "dublin" 
function outputPosition() { 
    alert(mylocation); 
    var mylocation = "fingal" ; 
    alert(mylocation); 
} 
outputPosition(); 

Cette volonté sortie "non défini" et " fingal "

Pourquoi?

+11

Le premier devrait lancer une erreur ReferenceError sauf si 'mylocation' était déjà défini ailleurs. –

+0

@GGG. vérifiez ceci [violon] (http: // jsfiddle.net/UcrVH /) – gdoron

+0

@gdoron beau travail, détective psychique: D –

Répondre

6

Une fois que vous déclarez une variable en utilisant le mot-clé var dans une fonction javascript et peu importe où vous placez cette déclaration - en haut de la fonction ou sur le mais, elle sera considérée comme variable locale. C'est pourquoi vous obtenez undefined lorsque vous essayez d'obtenir la valeur d'une telle variable avant la déclaration var.

5

Dans la deuxième option, vous masquez mylocation (que j'espère a été déclaré dans la portée externe.) Avec une nouvelle variable via la déclaration var.

"En JavaScript, une variable peut être déclarée après avoir été utilisée." signifie: JavaScript tire vers le haut var déclarations vers le haut de la portée (peu importe où il a été déclaré!), donc dans votre deuxième fonction var mylocation est implicitement défini, mais pas affecté avant la première alerte, d'où il sort undefined à ce stade .

0

En JavaScript - déclarations de variables sont hissés mais l'initialisation est pas. Cela signifie que lorsque vous écrivez var n'importe où dans une fonction, il sera traité comme déclaré en haut. Donc, il ne prendra pas le même nom de variable de l'espace global. @Ashish a raison, le premier extrait devrait sortir «dublin» et «fingal».

0

Prenez par exemple:

x = 5; 
var x; 

console.log(x); 

Techniquement, vous voudrez peut-être regarder x = 5; comme une déclaration erronée dans ce contexte compte tenu du fait qu'il vient avant la déclaration, mais le JS moteur ne fonctionne pas de cette façon . Il voit x = 5 et var x comme deux instructions distinctes, la première une tâche liée au compilateur, et la seconde une tâche liée à l'exécution. Cela signifie en termes simples que toutes les déclarations d'une étendue, quel que soit l'endroit où elles apparaissent, sont traitées avant l'exécution du code lui-même. Par exemple, vous pouvez exécuter une variable avant de la déclarer.