千家信息网

提升在JavaScript中的工作原理是什么

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇"提升在JavaScript中的工作原理是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起
千家信息网最后更新 2025年01月21日提升在JavaScript中的工作原理是什么

这篇"提升在JavaScript中的工作原理是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"提升在JavaScript中的工作原理是什么"文章吧。

提升(Hoisting)是 JavaScript 的概念,它使 JavaScript 与 Java 语言不同。在 Java 中,代码中创建的每个变量都具有块级作用域。意味着如果我们创建了任何将其可见性限制在声明它的块中的变量。因此,如果我们在声明中使用上面的变量,则会出错。但是在 JavaScript 中,变量可以在声明之前使用,这种机制称为 Hoisted。这是 JavaScript 的默认行为。

提升是 JS 的默认行为,即在代码执行之前定义作用域顶部的所有声明。提升的好处之一是它使我们能够在函数出现在代码中之前调用它们。JavaScript 只提升声明,而不是初始化。

理解 JavaScript 提升变量究竟是什么声明和初始化按以下顺序进行:

声明 -> 初始化/赋值 -> 用法

// Variable lifecyclelet x;                 // Declarationx = "hoisting";        // Assignmentconsole.log(x);        // Usage

最重要的是,应该始终记住 JavaScript 首先在后台声明变量。然后,初始化它们。因此,了解变量声明的处理发生在任何代码执行之前也是很好的。但是,在执行分配它们的代码之前,JavaScript 中不存在未声明的变量。因此,在执行赋值时,分配给未声明变量的值会隐式地将其创建为全局变量。这指定所有未声明的变量都是全局变量。

// hoistingfunction Hoisting(){  x = 100;  let y = 200;}Hoisting();console.log(x); // 100console.log(y); // Reference Error: y is not defined

在上面的代码示例中,有一个名为 Hoisting() 的函数。因此,我们有一个没有使用 let/var/const 声明的变量和一个 let 变量 y。将未声明的变量分配给全局作用域是由 JavaScript 完成的。但是对于变量 y,我们得到了一个引用错误(Refence Error)。

在函数作用域变量中托管

在 ES5 中,我们考虑 var 关键字。与 let/const 相比,使用 var 进行提升有些不同。使用 var 来查看提升如何工作的示例:

var num (global)console.log(car);    // undefinedvar car = 'Lamborgini';

在上面的代码中,当记录在使用它之后声明和分配的变量名称时,编译器给出"undefined"的结果。这是意料之中的,因为我们应该在声明它之前就尝试使用 car 变量,因为我们应该得到 ReferenceError。但是解释器对此有不同的看法,如下所示:

//how interpreter sees the above codevar car;console.log(car); // undefinedcar = 'Lamborgini';

let 和 const 关键字。

用 let 或 const 声明的变量和常量不会被提升!

JavaScript 初始化不是初始化。

JavaScript 只能提升声明,而不能用来初始化。

var a = "volkswagon"; // Initialize avar b = "Lamborgini"; // Initialize belem = document.getElementById("car"); // Find an elementelem[xss_clean] = a + " " + b;       // Display a and b as volkswagon and lamborgini

在上面的代码中,因为变量的声明发生在结果之前。所以结果,代码的执行打印了变量 a 和 b 的结果。

var a = "i10";  // Initialize aelem = document.getElementById("car");      // Find an elementelem[xss_clean] = "a is " + a + " and b is " + b;  // Display a and bvar b = "Lamborgini";  // Initialize b

结果:

a 是 i10 而 b 是未定义的。

因此,这是因为只发生了声明(var b)的提升,而不是初始化(="Lamborgini")到顶部。由于提升,b 在使用之前已经声明,但是因为初始化没有提升,所以 b 的值是未定义的。

提升类(Hoisting Classes)

JavaScript 类可以分为两类:

  • 类声明

  • 类表达式

在类声明中,它们很像函数对应物。因此,这意味着不会提升 JavaScript 类声明。但是,它们在评估之前保持未初始化状态。因此,这实际上意味着必须先声明一个类,然后才能使用它。

var car1 = new car();car1.height = 5;car1.weight = 500;console.log(car1);   // Output: ReferenceError: car is not definedclass car{  constructor(height, weight) {    this.height = height;    this.weight = weight;  }}

在上面的代码中,出现了引用错误。这是因为在 car1 变量初始化之后,汽车类的定义就发生了。为了解决这个错误,我们只需要在 car1 初始化之前定义 car 类。这是在类声明中托管。

class car{  constructor(height, weight) {    this.height = height;    this.weight = weight;  }}var car1 = new car();car1.height = 5;car1.weight = 500;console.log(car1);

因此,这给出了正确的结果。在 Class 表达式中它们很像它们的函数对应物。因此,这意味着没有提升类表达。因此,下面是类表达式的未命名或匿名变体的示例:

var rect = new shapes();rect.height = 10;rect.width = 20;console.log(rect); // Output: TypeError: shapes is not a constructorvar shapes = class {  constructor(height, width) {    this.height = height;    this.width = width;  }};Thus, the correct way to do it is like this:var shapes = class {  constructor(height, width) {    this.height = height;    this.width = width;  }};var rect = new shapes();rect.height = 10;rect.width = 20;console.log(rect);

以上就是关于"提升在JavaScript中的工作原理是什么"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0