2011-09-22 18 views
5

Editar Parece que fue un problema de mi parte y mi uso de jsfiddle:?Intentando comprender completamente el izado de JavaScript

He estado leyendo un par de artículos sobre elevación últimamente, uno es by Nicholas Zakas, y el otro es by Ben Cherry.

Im tratando de seguir los ejemplos y simplemente probar por mi cuenta para asegurarse de que comprenden totalmente, pero Im tener un problema sobre todo con este ejemplo,

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

En lugar de la tala undefined su registro 1. Si entiendo todo correctamente, a debe ser undefined, porque debe existir en el ámbito de la ventana debido a que la instrucción var se iza al principio, por lo que no se le debe asignar el valor.

Sin embargo, el siguiente está actuando como se esperaba,

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

foo es undefined, y baz no está definido. Tengo un fiddle aquí con ambos ejemplos. Realmente solo estoy tratando de entender esto. ¿Ha cambiado algo desde que se escribieron estos artículos? Si alguien puede arrojar algo de luz sobre esto, sería apreciado. Estoy usando Chrome 14 cuando estoy probando.

+0

estoy corriendo el violín en Google Chrome y se imprime 'undefined'. Para una buena explicación de la elevación, puede echarle un vistazo a * O'Reilly JavaScript Patterns *. Hay un ** párrafo ** dedicado. – user278064

+0

Sí, aparentemente fue debido a que no usé jsfiddle correctamente doh. – Loktar

Respuesta

2

En el segundo ejemplo, elevación transforma el código en este:

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

Así foo no está definido en la primera llamada para iniciar la sesión . La declaración siempre se iza a la parte superior de la función adjunta, pero la asignación nunca se iza con ella.

+0

Creo que cometiste un error tipográfico. – pimvdb

+0

sí, un pequeño – dtanders

1

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

var object = {a: undefined}; 

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

Tienes jsFiddle establece en onLoad, por lo var a está en el ámbito de la función onLoad. Cambiarlo a no wrap y se obtiene:

undefined 
undefined 
Uncaught ReferenceError: baz is not defined 
0

elevación se entiende de manera diferente, pero a mi entender lo que hace es

Siempre que se crea una variable/funciones en ella se establece un espacio de memoria para you.It no lo hace poner la variable/funciones en la parte superior del contexto de ejecución.

Escriba 'this/window' en la consola, encontrará sus var/funciones allí sentado léxicamente.

por ejemplo:

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

Si se coloca en la parte superior durante la ejecución entonces no debería funciones 'indefinido' obtendrá excuted.Variables no conseguirá excuted salida de 'Hola'.Por favor, evite izado excute los VARs después de que se declara:

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

b(); //returns Hello World 
Cuestiones relacionadas