2014-06-05 12 views
14

Bazı JavaScript kodu görüyordum tanımlanmamış bekliyor ve böyle bir şey tökezledi:JavaScript

function() { 
    if(true) { 
     var a = 5; 
    } 
    alert(a); 
} 

Bu tanımsız çıktı olurdu emindim ama etmedi? Birisi bana nedenini söyleyebilir mi?

+0

Sadece merak, 'zaten bloke if' ... – War10ck

+4

@pstenstrm ne anlamı var - tek burada yer alan fonksiyon ve bunun dışına hiçbir ifadeleri var. Kapanışlar ilgisiz. – Quentin

+2

@pstenstrm Kapanış mı? Burada kapatma yok. –

cevap

14

JavaScript'in blok seviyesi kapsamını değil, işlev düzeyi kapsamı vardır. JavaScript blok düzeyi kapsamına olsaydı

function() { 
    var a; 
    if(true) { 
     a = 5; 
    } 
    alert(a); 
} 

, o zaman yine undefined çıkış olmaz: var deyimi çekiliyor

böylece kod eşdeğerdir. a, alert bildiriminde bildirilmeyeceğinden, bir başvuru hatası tetiklersiniz.

+0

Ayrıca, bu bir sözdizimi işlevi olarak adlandırılan bir sözdizimi hatasıdır. –

+0

@IanClark Konu dışında, bu muhtemelen tam bir ifadenin bir parçası. –

+0

Kaldırma/scoping'i anlamadıklarından bahsetmeyi düşündüğüm halde :) –

2

Değişken tanımları işlevin en üstüne taşınır (değişken kaldırma); blok seviyesi değişkenleri yoktur.

derleyici blok kapsamları sadece küresel kapsamları \ işlev yok

function() { 
    var a; 
    if(true) { 
     a = 5; 
    } 
    alert(a); 
} 
2

JS kodunuzu değiştirir.
Sizin durumunuzda, varyasyon, işlevin tepesinde değer olmadan beyan edilir ve atanır. Kapsamları hakkında iyi bir öğretici

Here's.

+0

Tam olarak, bu yüzden. – avcajaraville

3

Bunun nedeni, bunun, kaldırma denilen şeyin bir sonucudur. Kaldırma, değişkenin bildirimini kapsamın en üstüne taşır. .

function() { 
var a; 
if(true) { 
    a = 5; 
} 
alert(a); 
} 

"değişken bildirimleri (ve genel olarak beyanlar) Herhangi kodu yürütülmeden, kodda herhangi bir yerinde bir değişken bildirerek üstünde deklare eşdeğerdir işlenir çünkü bu: Yani işlevi gerçekten böyle görünüyor Ayrıca, bir değişkenin bildirilmeden önce kullanılabileceği anlamına gelir.Bu değişkenin, işlevinin veya genel kodun üst kısmına taşındığı görüldüğü gibi, "kaldırma" denir. - var MDN

+1

+1 Yükseltme. Bu tam bir cevap.Kaldırma ile işbirliği içinde işlev seviyesinde kapsam belirleme en önemli nedendir. İyi açıkladı! –