2011-09-22 4 views
5

Modifier On dirait que c'était un problème de ma part et mon utilisation de jsfiddle:?Essayer de comprendre complètement le levage JavaScript

J'ai lu quelques articles sur le levage récemment, l'un est by Nicholas Zakas, et l'autre est by Ben Cherry.

Im essayant de suivre les exemples et tester simplement sur mon propre pour vous assurer que je saisis bien, mais Im ayant un problème principalement avec cet exemple,

if (!('a' in window)) { 
    var a = 1; 
} 
console.log(a); 

Au lieu de l'exploitation forestière undefined son exploitation forestière 1. Si je comprends tout correctement, a devrait être undefined, parce que devrait exister dans la fenêtre en raison de l'instruction var hissé en haut, donc il ne devrait pas être assigné la valeur.

Mais ce qui suit agit comme prévu,

(function bar(){ 
    console.log(foo); 
    var foo = 10; 
    console.log(baz); 
})(); 

foo est undefined et baz n'est pas défini. J'ai un fiddle ici avec les deux exemples. Vraiment juste essayer d'envelopper ma tête autour de ça. Est-ce que quelque chose a changé depuis que ces articles ont été écrits peut-être? Si quelqu'un peut faire la lumière sur cela, ce serait apprécié. Im en utilisant Chrome 14 lors des tests.

+0

Je suis en votre violon dans Google Chrome et imprime 'undefined'. Pour une bonne explication du levage, vous pouvez jeter un oeil à * O'Reilly JavaScript Patterns *. Il y a un ** paragraphe ** dédié. – user278064

+0

Oui, apparemment, c'était parce que je n'utilisais pas correctement jsfiddle. – Loktar

Répondre

2

Dans le second exemple, Hisser transforme le code en ceci:

(function bar(){ 
    var foo; 
    console.log(foo); 
    foo = 10; 
    console.log(baz); 
})(); 

Alors foo est pas défini lors du premier appel à se connecter . La déclaration est toujours hissée en haut de la fonction englobante, mais l'assignation n'est jamais levée avec celle-ci.

+0

Je pense que vous avez fait une faute de frappe. – pimvdb

+0

ouais, un petit – dtanders

1

object.a === undefined; // true, mais a in object; // true

var object = {a: undefined}; 

('a' in object); // is true because a is a property of object 
2

Vous avez jsFiddle réglé sur onLoad, donc var a est SCOPED à la fonction onLoad. Changez-le no wrap et vous obtenez:

undefined 
undefined 
Uncaught ReferenceError: baz is not defined 
0

est comprise différemment Hisser mais à ma compréhension ce qu'il fait est

Chaque fois que vous créez une variable/fonctions il met en place un espace de mémoire pour ne you.It mettre la variable/fonctions en haut du contexte d'exécution. Tapez 'this/window' dans la console, vous trouverez votre var/fonctions assis là lexicalement.

par exemple:

a; //returns undefined 
b(); //returns Hello World 
var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 

Si elle est placée sur le dessus lors de l'exécution, il devrait sortie « Bonjour » et non « undefined » fonctions sera excuted.Variables ne seront pas excuted. S'il vous plaît éviter de levage excute les vars après est déclaré:

var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 
a; //returns Hello 

b(); //returns Hello World