답변:
let
다음과 const
크게 다른 두 가지가 있습니다 var
.
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
, class
및 function
), 그러나 범위를 입력하고 액세스 할 수없는 경우 선언되는 기간 사이에있다. 이 기간은 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.blockScoping
CLI를 또는 라이브러리로 사용하는 플래그.
추가 읽기를 권장 : TDZ는 신화화 와 ES6하자, 헌장과 "임시 사각 지대"깊이에서 (TDZ) .
let foo
블록 안에 있으면 해당 블록의 상단에 게양되어 선언됩니다. 라인 let foo
이 초기화됩니다. 그리고 foo = xyz
값이 할당되도록합니다.
ㅏ :
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;
undefined
및 추가 결과 5
). 의 선언 은 var a
호이스트 a
되고 , 초기화 코드 는 5로 설정되지 않습니다.