{}의 함수 선언에 대해 혼동


18

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

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

위 코드를 보았고 {}에 함수가 선언되었습니다. 0 0을 인쇄한다고 생각하지만 0 5를 인쇄합니다.



1
엄격 모드에서는을 기록 0 undefined합니다.
특정 성능

@certainPerformance는 잘 설명 할 수 있지만 a = 5블록 을 벗어나는 것은 설명하지 못합니다 . 듀 피의 베르기에 따르면, function a게양 될 것입니다.
Jonas Wilms

2
함수 선언에 도달하면 로컬 범위의 블록 변수가 외부 블록에 복사되는 것처럼 보입니다.
Jonas Wilms 7

답변:


13

다음과 같은 일이 발생합니다.

(1) 두 개의 변수 선언이 있습니다 a. 하나는 블록 내부와 다른 하나는 외부입니다.

(2) 함수 선언은 승강되어 내부 블록 변수에 바인딩됩니다.

a = 5블록 변수를 무시하는 (3) 에 도달합니다.

(4) 함수 선언에 도달하고 블록 변수가 외부 변수에 복사됩니다. 둘 다 지금 5입니다.

(5) a = 0에 도달하면 블록 변수가 무시됩니다. 외부 변수는 이것의 영향을받지 않습니다.

 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¹);

이것은 그것은의 일부입니다, 정말 실제로 사양의 일부가 아닌 웹 기존의 호환성을 의미 하므로, 블록 내부의 함수를 선언하지 않는이런 식으로 행동하는이 코드에 의존하지 않습니다 .

이것도 여기에 설명되어 있습니다


그러나 왜 함수 선언에 도달하면 블록 변수가 외부 변수에 복사됩니까? 디버거에서 결론을 내립니까?
Chor

@Chor no, 사양은 그렇게 말합니다. 왜 그런지 모르겠습니다.
Jonas Wilms
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.