@thefourtheye는 이러한 변수 가 선언되기 전에 액세스 할 수 없다고 말하는 것이 정확합니다 . 그러나 그것보다 조금 더 복잡합니다.
변수가 호이스트 let
되거나 선언 const
되지 않은 변수 입니까? 여기서 무슨 일이 벌어지고 있습니까?
모든 선언은 ( var
, let
, const
, function
, function*
, class
) "게양"하는 자바 스크립트. 즉, 이름이 범위에서 선언되면 해당 범위에서 식별자가 항상 해당 특정 변수를 참조합니다.
x = "global";
// function scope:
(function() {
x; // not "global"
var/let/… x;
}());
// block scope (not for `var`s):
{
x; // not "global"
let/const/… x;
}
기능 및 블록 범위 1 모두에 해당 됩니다.
의 차이 var
/ function
/ function*
선언과 let
/ const
/ class
선언은입니다 초기화 .
전자는 undefined
바인딩의 맨 위에 바인딩이 생성 될 때 또는 (생성기) 기능 으로 초기화됩니다 . 그러나 사전에 선언 된 변수는 초기화되지 않은 상태로 유지 됩니다. 즉, ReferenceError
액세스하려고하면 예외가 발생합니다. 때 만 초기화 얻을 것이다 let
/ const
/ class
문이 평가되는 호출되는 (위)하기 전에, 모든 시간 데드 존을 .
x = y = "global";
(function() {
x; // undefined
y; // Reference error: y is not defined
var x = "local";
let y = "local";
}());
공지는 것을 let y;
문에 변수 초기화합니다 undefined
같은 let y = undefined;
것입니다.
시간적 데드 존은 구문론 위치, 오히려없는 시간 변수 (범위) 생성 및 초기화 사이. 코드가 실행되지 않는 한 선언 위의 코드에서 변수를 참조하는 것은 오류가 아닙니다 (예 : 함수 본문 또는 단순히 죽은 코드). 코드가 선언 아래에 있습니다 (예 : 너무 일찍 호출 된 함수 선언에서).
이 문제 let
와 그 사이에 차이점 const
이 있습니까?
아니오, 호이 스팅이 고려되는 한 동일하게 작동합니다. 그들 사이의 유일한 차이점은 const
개미가 선언의 초기 부분에서만 할당되어야하고 할당 될 수 있다는 것입니다 ( const one = 1;
, const one;
같은 재 할당 one = 2
은 유효하지 않습니다).
1 : var
선언은 여전히 함수 수준에서만 작동합니다.
let foo = () => bar; let bar = 'bar'; foo();
보여줍니다 .