{} içindeki işlev bildirimi hakkında karıştı


18

var a;
if (true) {
  a = 5;

  function a() {}
  a = 0;
  console.log(a)
}
console.log(a)

Yukarıdaki kodu gördüm, bir fonksiyon {} 'da bildirildi. Bence 0 0 basar, ama 0 5 basar



1
Katı modda günlüğe kaydeder 0 undefined.
CertainPerformance

@certainPerformance iyi, bu açıklanabilir, ancak a = 5bloğu bıraktığını açıklayamıyorum . Dupe bergi göre, çekilecek function a.
Jonas Wilms

2
Yerel olarak kapsamlandırılmış blok değişkeni, işlev bildirimine ulaşırken dış bloğa kopyalanıyor gibi görünüyor.
Jonas Wilms

Yanıtlar:


13

Aşağıdakiler olur:

(1) İki değişken bildirimi vardır a, biri blok içinde diğeri dışında.

(2) İşlev bildirimi kaldırılır ve iç blok değişkenine bağlanır.

(3) a = 5'e ulaşılır, bu da blok değişkenini geçersiz kılar.

(4) fonksiyon bildirimine ulaşılır ve blok değişkeni dış değişkene kopyalanır. İkisi de şimdi 5.

(5) a = 0'e ulaşılır, bu da blok değişkenini geçersiz kılar. Dış değişken bundan etkilenmez.

 var a¹;
 if (true) {
   function a²() {} // hoisted
   a² = 5;
   a¹ = a²; // at the location of the declaration, the variable leaves the block      
   a² = 0;
  console.log(a²)
}
console.log(a¹);

Bu bir parçası, gerçekten aslında özelliklerinin bir parçası değildir , web eski uyumluluk semantik yüzden, blokların içinde işlevlerini bildirmek yoktur ve bu şekilde davranmasına Bu kodun güvenmeyin .

Bu da burada açıklanıyor


Ama neden fonksiyon bildirimi ulaşıldığında, blok değişkeni dış değişkene kopyalanacaktır?
Chor

@Chor hayır, spec söylüyor. Neden olduğuna dair hiçbir fikrim yok.
Jonas Wilms
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.