首页 >web前端 >js教程 >JavaScript 中提升的奥秘!

JavaScript 中提升的奥秘!

Susan Sarandon
Susan Sarandon原创
2024-12-27 00:39:11762浏览

Mystery of Hoisting in JavaScript!

JavaScript 充满了怪癖,而提升是容易让新手感到困惑的怪癖之一。但不用担心,读完这篇文章后,您将对简化的提升有一个清晰的了解!

什么是吊装? ?

本质上,提升是 JavaScript 将声明移动到其作用域顶部的默认行为。这并不意味着代码在物理上被重新排列——这只是 JavaScript 引擎解释它的方式。

这样想:在 JavaScript 开始执行代码之前,它会通过预先为所有变量和函数分配内存来“准备”,甚至在执行一行代码之前也是如此。

关于吊装的常见误区

仅提升变量。
?? 不正确
函数声明和变量声明都被提升。

提升的变量会自动初始化。
?? 又错了
变量被提升但未初始化。在明确分配之前,它们的值保持未定义。

通过示例了解提升?

1。变量提升
让我们从使用 var:
声明的变量开始

console.log(greeting); // Output: undefined
var greeting = "Hello, World!";

这里发生了什么? JavaScript 在执行过程中会这样对待代码:

var greeting; // Declaration is hoisted
console.log(greeting); // Accesses the variable before initialization
greeting = "Hello, World!"; // Initialization happens here

但是对于 let 和 const,情况就不同了:

console.log(name); // ReferenceError: Cannot access 'name' before initialization
let name = "Sudhil";

使用 let 或 const 声明的变量会被提升,但它们处于“临时死区”(TDZ),直到遇到它们的声明。

2。函数提升
函数声明完全提升,它们的名称和主体都在声明行之前可用:

sayHello(); // Output: "Hello!"

function sayHello() {
    console.log("Hello!");
}

但是,函数表达式的行为有所不同:

sayHi(); // TypeError: sayHi is not a function

var sayHi = function () {
    console.log("Hi!");
};

在这种情况下,变量 sayHi 被提升,但在达到赋值之前不会初始化。

3。等级提升
类的行为与 let 和 const 类似。它们已被吊起,但在声明之前无法访问。

const instance = new MyClass(); // ReferenceError: Cannot access 'MyClass' before initialization

class MyClass {
    constructor() {
        this.name = "Classy!";
    }
}

为什么吊装很重要? ?

1。预测行为
了解提升可以帮助您预测代码将如何运行并避免常见的陷阱,例如在初始化之前使用变量。

2。干净的代码
为了避免混淆,请在变量和函数作用域的顶部声明它们。这与 JavaScript 的提升行为一致,并使您的代码更具可读性。

结束了吗?

以下是关于吊装的注意事项: ?

  • 声明(变量、函数和类)被提升;初始化则不然。
  • var 声明被提升为 undefined; let 和 const 留在暂时死区
  • 函数声明已完全提升,但函数表达式未完全提升。
  • 提升可以帮助 JavaScript 引擎理解您的代码,而理解提升可以帮助您编写更好的代码。

感谢您的阅读! ?
继续尝试 JavaScript 怪癖,并继续关注本系列的更多内容。?
快乐编码! ??‍?✨

以上是JavaScript 中提升的奥秘!的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn