2011-07-20 6 views
5

Bazen geri yükleme için JavaScript'i okuyordum.JavaScript kaldırma ve gerçeği anlama ve gerçeği

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

ve daha JavaScript tip zorlama, gerçeği & yanlış testi hakkında bazı: Truth, Equality and JavaScript ve diğer bazı kaynak

Ve bazı uygularken karşılaştıkları ve bazı önemli kavram eksik m bulundu Kaldırma ve değişken hakkında 'doğruluk & falsi.

1 'ise' yinelenen değişken beyanı ile gerçek deney

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

} 
bar(); 

o/s: inside if

Kuşku: 'foo' değerini, '1' if(!foo)false olarak değerlendirilirse gerekir ve Bu blok yürütülmemelidir (yukarıdaki kaynaklardan alıntı: kaldırma, yalnızca var & function bildirimini etkiler, ancak yürütmeyi etkilemez). Ama bu uyarı neden gösteriliyor?

2: Doğrudan (pasajı 3. no-hile aşağıdaki kod gösterilmektedir): false kullanırsanız Bu durum böyle değil yinelenen değişken bildiriminde

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

} 
bar(); 

o/p olmadan 'eğer' gerçeği testi : çıkış yok; denetim bloğu 'eğer' girmedi demektir
Bu bir beklemek ne

3: yinelenen değişken bildiriminde

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

o/p 'eğer' kullanarak 'yanlış': hiçbir çıkış; 'if' bloğu girilmiyor kontrol edilir

Birisi lütfen açıklığa kavuşabilir. Teşekkürler

cevap

8

, uyarı gösterilir, bu yüzden eşdeğerdir:


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

} 
bar(); 

Bu tür sorunların, tüm değişkenleri açıkça işlevin en üstünde bildirmek için zorlayıcı bir neden sundukları sonucuna varılabilir.

+2

Benim hatam. İşe hiç aldırmadım. Sadece tip baskısı ve kaldırma üzerinde yoğunlaşıyorum (kafamın içinde dönüyorlar). Yinelenen beyan bir fonksiyonun içinde değilse, o zaman 'foo' ikinci deklarasyondan sonra bile bir önceki değere (1) sahip olacaktır. Tüm bu düşünce beni kullanılan işlevi kaçırmamı sağladı. Gözümüzü açtığın için teşekkürler :) – manikanta

+0

Neden üç numara çalışmıyor? Eğer bir değişken tanımlanmamış ise, yanlış mıdır? – bill

1

Yalnızca bildirimi bildirimi hevesle değerlendirilmektedir. İlk durumunuzdaki değişken ataması (if satırında) sadece if satırını girdiğinizde oluşur.

sadece bildirir ancak herhangi bir değeri atamak değil değişken, (false için zorlar) undefined değerini sahiptir. Eğer fonksiyonun üstüne çekiliyor işlevi içinde var ve var beyanı kullandığınız için

senin örneğin 1 numaralı İçin
+0

Cevabınız için teşekkürler. @patrick dw ve Siz ikiniz de doğru cevap verdiniz (aslında cehaletimi görmezden geldiğiniz için teşekkürler). Ama sadece tek bir cevabı kabul edebilirim ve ilk olarak Bay Patrick'in kabul ettiği gibi, onun kabulünü kabul ettim. Bu arada senin cevabını da yükselttim. Teşekkürler. – manikanta