2011-07-20 15 views
5

He estado leyendo sobre el levantamiento de JavaScript hace algún tiempo.Entender el levantamiento de JavaScript y truthy & falsy

JavaScript Scoping and Hoisting by Ben Cherry
Two words about “hoisting” by Dmitry Soshnikov

y, un poco más sobre JavaScript tipo de coerción, la verdad & falsa prueba: Truth, Equality and JavaScript y algún otro recurso

Y mientras que la práctica de algunos, y se encontró que M FALTA algún concepto importante sobre el alzamiento y una variable 'truthy & falsy.

1: 'si' prueba de la verdad con la declaración de variable duplicado

var foo = 1; 
function bar() { 
    if (!foo) { 
    alert('inside if'); 
     var foo = 10; 
    } 

} 
bar(); 

O/P: inside if

Duda: valor 'foo' ser '1', if(!foo) debe evalúa a false y ese bloque no debe ejecutarse (citando los recursos anteriores: el desplazamiento afecta solo a la declaración var & function, pero no a la ejecución). Pero por qué se muestra esa alerta. Este no es el caso si uso directamente false (se muestra en el siguiente no-tricks código: fragmento # 3)

2: 'si' prueba de verdad sin declaración de variable duplicado

var foo = 1; 
function bar() { 
    if (!foo) { 
     alert('inside if'); 
    } 

} 
bar(); 

O/P : sin salida; medio que no entró en el control 'si' bloque de
Esto es lo que se podría esperar

3: 'si' el uso de 'falso' con duplicado declaración de variables

var foo = 1; 
function bar() { 
    if (false) { 
     alert('inside if'); 
     var foo = 10; 
    } 
} 
bar(); 

O/P: sin salida; significa que el control no entró en el bloque 'si'
Esto es lo que uno podría esperar

Alguien aclare. Gracias

Respuesta

8

Para su ejemplo número 1, la alerta se muestra porque usted está utilizando var dentro de la función y la declaración var es izado a la parte superior de la función, por lo que es equivalente a:


var foo = 1; 
function bar() { 
    var foo; 
    if (!foo) { 
     alert('inside if'); 
     foo = 10; 
    } 

} 
bar(); 

Se podría concluir que este tipo de problemas ofrecen una razón de peso para declarar explícitamente todas las variables en la parte superior de la función.

+2

Mi mal. No me importó la función en absoluto. Solo me estoy concentrando en el tipo de coerción y izado (giran en mi cabeza). Si la declaración duplicada no está dentro de una función, entonces 'foo' tendrá el valor anterior (1) incluso después de la segunda declaración. Todo este pensamiento me hizo perder la función utilizada. Gracias por abrir mi ojo :) – manikanta

+0

¿Por qué no funciona el número tres entonces? si una variable no está definida, ¿significa que es falsa? – bill

1

Sólo la variable declaración se evalúa con entusiasmo. La asignación de la variable en su primer caso (en el bloque if) solo se produce al ingresar al bloque if.

La variable sólo se declara , pero no asigna ningún valor a, tiene el valor de undefined (que coacciona a false).

+0

Gracias por la respuesta. @patrick dw y ambos respondieron correctamente (de hecho, gracias por ignorar mi ignorancia). Pero solo puedo aceptar una sola respuesta y, como el Sr. Patrick respondió primero, acepté la suya. Por cierto, he 'Up'ed tu respuesta también. Gracias. – manikanta

Cuestiones relacionadas