>  기사  >  웹 프론트엔드  >  JavaScript의 선언 승격에 대해 이야기해 보겠습니다.

JavaScript의 선언 승격에 대해 이야기해 보겠습니다.

WBOY
WBOY앞으로
2022-11-14 17:59:021091검색

이 글은 JavaScript에 대한 관련 지식을 제공하며, 구문 승격에 대한 관련 내용을 주로 소개합니다. 구문 승격은 코드에서 함수 및 변수 선언문의 효과를 추출하는 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,改用更合理的 letconst

letconst 变量声明和死区

那么,letconst 就不存在变量提升了吗?—— 未必。

看这个例子:

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"; 一行影响了作用域内的上方区域代码。

解析器会扫描当前作用域下的 constlet 声明,在声明语句之前使用变量名都会触发 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를 사용하지 않고 보다 합리적인 letconst를 사용하기로 결정했습니다. 🎜

letconst 변수 선언 및 데드존 🎜🎜그래서, letconst 변수 승격이 존재하지 않나요? —— 꼭 그렇지는 않습니다. 🎜🎜이 예를 보세요: 🎜rrreee🎜 const x = "x in function"; 줄이 범위의 상위 지역 코드에 영향을 미친다는 것을 나타내는 실행 오류가 보고됩니다. 🎜🎜파서는 현재 범위에서 constlet 선언을 검색합니다. 선언문 앞에 변수 이름을 사용하면 ReferenceError가 발생합니다. 이렇게 하면 위에서 언급한 var 승격 문제와 모호한 코드 패턴을 피할 수 있습니다. 🎜🎜class 키워드도 동일한 효과를 가지며, new 선언되지 않은 클래스도 ReferenceError를 발생시킵니다. 🎜rrreee🎜어떤 사람들은 이 상황이 개선되지 않았다고 생각하고, 결국 선언과 할당이 미리 이루어지지 않았다고 생각하고, 어떤 사람들은 이러한 진술이 실행되기 전에 영향을 미치고 효과가 개선된다고 생각합니다. 개인적으로 나는 식별자(변수 및 클래스 이름)가 향상된 후자를 선호합니다. 🎜

요약🎜🎜 일부 JavaScript 선언문의 효과는 해당 선언문이 위치한 전체 범위에 영향을 미칩니다. 이러한 현상을 승격이라고 합니다. 🎜🎜프로모션에는 3가지 유형이 있습니다. 🎜
  • function 키워드 선언과 할당이 모두 프로모션됩니다. 🎜
  • var 키워드 선언은 승격되지만 할당은 승격되지 않습니다. 🎜
  • let, const, class 식별자가 승격되어 데드 존을 형성하며 선언이나 할당도 승격되지 않습니다. 🎜🎜🎜【관련 추천: 🎜JavaScript 비디오 튜토리얼🎜, 🎜웹 프론트엔드🎜】🎜

위 내용은 JavaScript의 선언 승격에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제