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 的提升行为一致,并使您的代码更具可读性。
以下是关于吊装的注意事项: ?
感谢您的阅读! ?
继续尝试 JavaScript 怪癖,并继续关注本系列的更多内容。?
快乐编码! ???✨
以上是JavaScript 中提升的奥秘!的详细内容。更多信息请关注PHP中文网其他相关文章!