아래에는 달콤하고 간단한 2줄의 코드가 있습니다. 그러나 나는 그것이 많은 혼란을 주거나(JS의 밑줄 원칙을 무시했기 때문에) 당신을 위로할 것이라고 장담할 수 있습니다.
그러나 아래와 같은 지식 개념이 완전히 로드되었습니다.
내 모순되는 진술
var, const와 마찬가지로 해당 속성을 끌어올리지만 서로 다른 영역에 있습니다.
데프 게양(간단한 /layman 버전)
이제 Js가 2줄 코드를 컴파일하고 실행하는 방법을 자세히 살펴보겠습니다.
JavaScript에서 컴파일러와 엔진이 변수 선언과 할당을 처리하는 방식은 특히 let 및 var를 처리할 때 미묘한 차이가 있을 수 있습니다.
주어진 코드에 대한 컴파일러와 실행 관점에서 프로세스를 분석해 보겠습니다.
name = 'ashu'; let name;
이 시점에서 우리가 자바스크립트 코드를 작성할 때 첫 번째 파서와 컴파일러가 코드를 컴파일한 다음 실행 단계로 들어간다는 점을 분명히 하겠습니다.
컴파일러 관점
첫 번째 줄: name = 'ashu';
컴파일 단계 중,
JavaScript 엔진은 코드를 구문 분석하고 필요한 범위를 생성합니다.
과제명 = '아슈';
가 표시되지만 이 단계에서는 엔진이 코드를 실행하지 않습니다. 이는 단지 name이라는 변수에 대한 할당의 존재를 기록할 뿐입니다.
name이 이전에 선언되지 않은 경우 var 선언은 끌어올려지고 전역적으로 액세스할 수 있으므로 컴파일러는 이를 전역 변수(전역 범위의 var 이름)에 대한 할당으로 처리합니다.
두 번째 줄: 이름을 알려주세요;
컴파일러가 let 이름을 발견할 때; 선언에서는 이름이 블록 범위여야 함을 인정합니다.
컴파일러는 이름이 속한 범위에 대해 TDZ(Temporal Dead Zone)에 이름을 배치합니다.
즉, 이름의 존재를 인정하지만 초기화되지 않은 것으로 표시합니다.
let 선언은 var와 같은 방식으로 끌어올려지지 않습니다.
대신 범위에 바인딩을 생성하고 선언이 실행될 때만 초기화합니다.
실행 관점
첫 번째 줄: name = 'ashu';
JavaScript 엔진이 할당 이름 = 'ashu';를 실행할 때,
현재 범위에 이름이 있는지 확인합니다. name은 let으로 선언되었지만 TDZ(Temporal Dead Zone)에 있으므로 let 선언이 초기화되기 전에 해당 이름에 액세스하려고 하면 ReferenceError가 발생합니다.
따라서 이 시점에서 이름은 TDZ에 있고 과제 이름은 'ashu'; ReferenceError.
가 발생합니다.두 번째 줄: 이름을 알려주세요;
이 줄은 블록 범위 내에서 이름 변수를 초기화합니다.
이 시점 이후에는 이름이 더 이상 TDZ에 없으며 오류 없이 액세스하거나 할당할 수 있습니다.
이제 보너스 팁
선언 취소, 정의되지 않음, 초기화되지 않음 간의 차이점;
undeclare :- 변수가 아직 선언되지 않았습니다.
정의되지 않음 :- 변수가 선언되었지만 초기화되지 않았습니다.
uninitialized :- 변수가 정의되었지만 해당 값은 나중에 제공됩니다.
예:- const 결과 = 곱하기By2(5);
함수의 반환 값이 결과에 할당될 때까지 해당 지점은 초기화되지 않은 영역에 있게 됩니다.
흥미로운 사실:-
처음에는 Const로 장식되었지만 늦은 시점은 **Let**
에서 채택한 시간적 데드존을 알고 계십니다.참조:-
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3