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

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

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



답변

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) .


답변

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

초기화 :

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

그래서 곧 :

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


답변

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;


답변