일시적 데드 존이란 무엇입니까?


150

액세스 하기 전에 값 letconst값이 초기화되기 전에 일시적인 데드 존ReferenceError 이라고 불리는 것이 발생할 수 있다고 들었습니다 .

일시적 데드 존이란 무엇이며, 범위 및 게양과 어떤 관계가 있으며, 어떤 상황에서 발생합니까?


답변:


201

let다음과 const크게 다른 두 가지가 있습니다 var.

  1. 그것들은 블록 범위 입니다.
  2. var선언되기 전에 a에 액세스 하면 결과가 나타납니다 undefined. 접근 let이나 const가 선언되기 전에하면 발생합니다 ReferenceError:

console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;

이러한 예제에서 let선언 (및 const동일한 방식으로 작동)은 값이 할당되기 전에 존재하지 않는 것으로 보이기 때문에 호이스트 되지 않을 수 있습니다 aLet.

즉, however- 그렇지 않은 let하고 const 있다 게양 (같은 var, classfunction), 그러나 범위를 입력하고 액세스 할 수없는 경우 선언되는 기간 사이에있다. 이 기간은 TDZ (Temporal Dead Zone) 입니다.

TDZ 때 종료 aLet됩니다 선언 보다는 할당 :

//console.log(aLet)  // would throw ReferenceError

let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10

이 예는 그것이 let게양되어 있음을 보여줍니다 .

let x = 'outer value';
(function() {
  // start TDZ for x
  console.log(x);
  let x = 'inner value'; // declaration ends TDZ for x
}());

크레딧 : Temporal Dead Zone (TDZ) demystified

x내부 범위에서 액세스 하면 여전히 ReferenceError. let게양되지 않은 경우 에는 기록 outer value됩니다.

TDZ는 버그를 강조하는 데 도움이되기 때문에 좋은 것입니다. 선언되기 전에 값에 액세스하는 것은 거의 의도적 인 일이 아닙니다.

TDZ는 기본 함수 인수에도 적용됩니다. 인수는 왼쪽에서 오른쪽으로 평가되며 각 인수는 할당 될 때까지 TDZ에 있습니다.

// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.

babel.js 트랜스 필러 에서는 기본적으로 TDZ가 활성화되어 있지 않습니다 . REPL 에서 사용하려면 "고 규격 준수"모드를 켜십시오 . 공급 es6.spec.blockScopingCLI를 또는 라이브러리로 사용하는 플래그.

추가 읽기를 권장 : TDZ는 신화화ES6하자, 헌장과 "임시 사각 지대"깊이에서 (TDZ) .



@ zeroflagL 좋은 링크, 감사합니다. 또한 "foo는 선언되지 않았으며 초기화되지 않았습니다"라고 말하며, 위의 답변에서 언어가 명확하게 / 수정되는 데 도움이 될 것입니다. let foo블록 안에 있으면 해당 블록의 상단에 게양되어 선언됩니다. 라인 let foo이 초기화됩니다. 그리고 foo = xyz값이 할당되도록합니다.
AJP

2
나는 이것이 훌륭한 게시물이라고 생각합니다! 그러나 '렛'이 게양을 당하지 않았다는 인상을 받았습니까? 나는 모질라 문서에서 이걸 발견 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... 나는 심술 궂은 구두쇠가 될하려고 아니에요, 난 그냥 궁금해서와 설명에 개방하고있다.
21시 39 분

1
@jeows MDN 페이지에는 여전히 들리지 않는다고 나와 있습니다. 자신이 말한 내용이 확실하다면 편집을 시도해야합니다. 나는 그것에 대해 질문을 게시해야한다고 생각합니다.
doubleOrt

1
@ joews IMO, 당신은 그들이 게양되었다고 말할 수 있지만 TDZ 때문에 선언에 도달하기 전에 접근 할 수 없거나, 게양되지 않았지만 TDZ는 그들에 대한 참조가 오류를 발생시킬 수 있습니다. 실제로 두 진술은 모두 똑같습니다. 제 생각에 "호이 스팅 = 엔진이 변수의 존재를 인식 할 때마다"와 같이 추상적 의미에서 "호이 스팅"이라는 용어를 사용하고 있다고 생각합니다. 그 이유는 무엇입니까? 게다가, 스펙은 그것에 대해 무엇을 말합니까?
doubleOrt

7

ㅏ :
let , const, var모든 GET 게양 과정이다.
(무엇보다 상위에 올라서 범위의 상단에 선언한다는 의미입니다.)

초기화 :

  • var초기 과정도 거치고의 초기 값을 얻습니다 undefined.
  • 반면 let, const그 값이 여전히 액세스 할 수없는, 그래서 그들은 이미 선언하지만, 초기 과정을 던져 가지 않았다. 무엇을 넣어temporal dead zone

그래서 곧 :

리프팅 과정 : var, let, const
초기화 과정 : var


0

let 및 const 변수의 경우 기본적으로 Temporal Dead Zone은 영역입니다

"변수가 선언되기 전에",

즉, 이러한 변수의 값에 액세스 할 수없는 경우 오류가 발생합니다.

전의.

let sum = a + 5;        //---------
//some other code       //         | ------>  this is TDZ for variable a
                        //         |
console.log(sum)        //---------
let a = 5;

위의 코드는 오류를 제공합니다

변수 'a'에 var를 사용하면 동일한 코드에서 오류가 발생하지 않습니다.

전의.

var sum = a;                            
console.log(sum)     //prints undefined
var a = 5;

콘솔 로그는 두 번째 예에서 "NaN"을 생성합니다 ( undefined및 추가 결과 5). 의 선언var a호이스트 a되고 , 초기화 코드 는 5로 설정되지 않습니다.
traktor53

예, 그렇습니다. 초기화없이 호이스트됩니다. 따라서 a는 정의되지 않습니다.
niranjan harpale

인용 된 첫 번째 예가 올바르지 않습니다. 수정하거나 제거하십시오.
Spidi의 웹
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.