2016-10-17 1 views
3

est un comportement très confus, je suis tombé sur je ne peux pas comprendre:Pourquoi cette fonction cède-t-elle 'indéfini'? Ce

var foo = 'outside'; 

function logIt(){ 

    console.log(foo); 
    var foo = 'inside'; 

} 

logIt(); 

qui donnera non défini. Ce qui est déjà inexplicable pour moi. Mais étranger est que ceci:

var foo = 'outside'; 

function logIt(){ 

    console.log(foo); 

} 

logIt(); 

sera effectivement donné en dehors.

Pourquoi cela se produit-il?

+3

Ceci est * levage * http://stackoverflow.com/questions/7506844/javascript-function-scoping-and-hoisting – JonSG

Répondre

5

Variable hoisting

Parce que les déclarations de variables (et des déclarations en général) sont traitées avant tout code est exécuté, déclarant dans le code une variable nulle est équivalent à déclarer au sommet.

D'où votre code est équivalent à:

var foo = 'outside'; 

function logIt(){ 
    var foo; 
    console.log(foo); 
    foo = 'inside'; 
} 

logIt(); 

et au moment de l'appel à console.log, foo estundefined.

2

Ceci a à voir avec les variables de levage en Javascript.

var foo = 'outside'; 

function logIt(){ 

    console.log(foo); 
    var foo = 'inside'; 
} 

logIt(); 

deviendront interne:

var foo = 'outside'; 

function logIt(){ 
    var foo; 
    console.log(foo); 
    foo = 'inside'; 
} 

logIt(); 

et donc, foo sera undefined dans le console.log :-)

0

Vous cherchez à hoisting javascript

Lorsque vous écrivez ceci:

var foo = 'outside'; 

function logIt(){ 

    console.log(foo); 
    var foo = 'inside'; 

} 

logIt(); 

Le javascript interprétera le code comme ceci:

var foo = 'outside'; 

function logIt(){ 
    var foo; //undefined 
    console.log(foo); 
    foo = 'inside'; 

} 

logIt(); 

l'intérieur foologIt() est déclarée comme undefined avant console.log(foo), c'est pourquoi il est indéfini.

Sur le deuxième exemple, le console.log(foo) s'exécute après avoir déclaré le var foo = 'outside' global, c'est pourquoi il imprime outside.

0

Comme mentionné correctement par d'autres, ceci est dû au levage.

Le levage est (pour de nombreux développeurs) un comportement inconnu ou négligé de JavaScript. Si un développeur ne comprend pas le levage, les programmes peuvent contenir des bogues (erreurs). Pour éviter les bogues, déclarez toujours toutes les variables au début de chaque portée.

Donc, dans votre exemple, il devrait ressembler à ceci:

function logIt(){ foo = 'inside'; console.log(foo); }

logIt();

pour les résultats attendus.