이 글은 JavaScript에 대한 관련 지식을 제공하며, 구문 승격에 대한 관련 내용을 주로 소개합니다. 구문 승격은 코드에서 함수 및 변수 선언문의 효과를 추출하는 JavaScript 파서의 기능입니다. 그것이 위치한 범위를 살펴보겠습니다. 모든 사람에게 도움이 되기를 바랍니다.
[관련 권장 사항: JavaScript 비디오 튜토리얼, web front-end]
선언 호이스팅(호스팅)은 코드에 있는 함수와 변수 선언문을 내부로 추출하는 JavaScript 파서의 기능입니다. 스코프의 전면입니다.
JavaScript는 함수 선언 전에 함수 호출을 지원합니다.
say();function say() { console.log("Hello"); }
파서는 범위 내의 코드를 스캔하고 실행된 코드 앞에 함수 선언을 추출합니다. 따라서 파서가 이 코드를 보는 방식은 다음과 같습니다.
function say() { console.log("Hello"); }say();
일반 함수 외에도 비동기 함수
, 함수*
, 비동기 함수*가 있습니다.
리프팅 효과도 동일합니다. async function
, function *
, async function *
也有相同的提升效果。
var
变量声明提升var
关键字的变量声明会被提升,但变量的赋值不会被提升。
console.log(foo); // undefinedvar foo = "bar";console.log(foo); // 'bar'
以上代码的解析结果为:
var foo;console.log(foo); foo = "bar";console.log(foo);
这可能会导致一些奇怪的问题:
var x = "x in global"; (function () { // 这里期望读取全局变量 console.log(x); // 结果为undefined. /* ... */ // 在函数内某处 var x = "x in function"; })();
在过去,为了规避这种奇怪的提升,大家普遍把var
声明写在作用域的最前面。
var x='x';var y='y';function (){ var x; var foo; // ...}
当然,现在我们选择不用 var
,改用更合理的 let
和 const
。
let
和 const
变量声明和死区那么,let
和 const
就不存在变量提升了吗?—— 未必。
看这个例子:
const x = "x in global"; (function () { // 这里期望读取全局变量 console.log(x); // ReferenceError: Cannot access 'x' before initialization /* ... */ // 在函数内某处 const x = "x in function"; })();
执行报错,说明 const x = "x in function";
一行影响了作用域内的上方区域代码。
解析器会扫描当前作用域下的 const
和 let
声明,在声明语句之前使用变量名都会触发 ReferenceError
。这样可以避免上面提过的 var
提升问题和模糊不清的代码范式。
class
关键字也有同样的效果,new
一个未声明的类也会发生 ReferenceError
。
new MyClass(); // ReferenceError: Cannot access 'MyClass' before initializationclass MyClass {}
有人认为这种情况不属于提升,毕竟声明和赋值都没有提前;也有人认为这些语句在执行之前就产生了影响,其作用提升了。个人偏向后者,这是对(变量和类名)标识符的提升。
一些 JavaScript 声明语句的效果会影响到所在的整个作用域,这种现象称为提升。
有 3 种类型的提升:
function
关键字的声明和赋值都提升。var
关键字声明提升,赋值不提升。let
, const
, class
var
변수 선언 승격 var
키워드의 변수 선언은 승격되지만 변수 할당은 승격됩니다. 승격되지 않습니다. rrreee위 코드의 구문 분석 결과는 다음과 같습니다. rrreee이로 인해 몇 가지 이상한 문제가 발생할 수 있습니다. rrreee
과거에는 이러한 이상한 개선을 피하기 위해 일반적으로 모든 사람들이var
를 작성했습니다. 범위 앞의 진술. 🎜rrreee🎜물론, 이제 var
를 사용하지 않고 보다 합리적인 let
및 const
를 사용하기로 결정했습니다. 🎜let
및 const
변수 선언 및 데드존 🎜🎜그래서, let
및 const
변수 승격이 존재하지 않나요? —— 꼭 그렇지는 않습니다. 🎜🎜이 예를 보세요: 🎜rrreee🎜 const x = "x in function";
줄이 범위의 상위 지역 코드에 영향을 미친다는 것을 나타내는 실행 오류가 보고됩니다. 🎜🎜파서는 현재 범위에서 const
및 let
선언을 검색합니다. 선언문 앞에 변수 이름을 사용하면 ReferenceError
가 발생합니다. 이렇게 하면 위에서 언급한 var
승격 문제와 모호한 코드 패턴을 피할 수 있습니다. 🎜🎜class
키워드도 동일한 효과를 가지며, new
선언되지 않은 클래스도 ReferenceError
를 발생시킵니다. 🎜rrreee🎜어떤 사람들은 이 상황이 개선되지 않았다고 생각하고, 결국 선언과 할당이 미리 이루어지지 않았다고 생각하고, 어떤 사람들은 이러한 진술이 실행되기 전에 영향을 미치고 효과가 개선된다고 생각합니다. 개인적으로 나는 식별자(변수 및 클래스 이름)가 향상된 후자를 선호합니다. 🎜function
키워드 선언과 할당이 모두 프로모션됩니다. 🎜var
키워드 선언은 승격되지만 할당은 승격되지 않습니다. 🎜let
, const
, class
식별자가 승격되어 데드 존을 형성하며 선언이나 할당도 승격되지 않습니다. 🎜🎜🎜【관련 추천: 🎜JavaScript 비디오 튜토리얼🎜, 🎜웹 프론트엔드🎜】🎜위 내용은 JavaScript의 선언 승격에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!