📜  声明变量反应挂钩 - Javascript (1)

📅  最后修改于: 2023-12-03 15:37:50.235000             🧑  作者: Mango

声明变量反应挂钩 - Javascript

在 Javascript 中,声明变量时会触发变量声明阶段,也称为“提升阶段”,在这个阶段,变量会被提升至其作用域的顶部。

变量声明
var

声明一个使用 var 关键字的变量时,它会被提升到函数作用域或全局作用域的顶部,取决于它是在函数内还是在全局作用域中声明的。

function foo() {
  console.log(myVar); // 输出 "undefined"
  var myVar = "Hello World!";
}

foo();

变量 myVar 在函数 foo 中被声明,但在使用 console.log 方法输出时,它的值为 undefined。这是因为代码在进入函数的执行阶段时,变量 myVar 被提升到了函数作用域的顶部。所以,console.log 方法在变量被赋值之前被调用了。

letconst

使用 letconst 关键字声明的变量会被提升到它们被定义的块级作用域的顶部。但是,它们不会被初始化,直到声明被执行。

function foo() {
  console.log(myLet); // 抛出“ReferenceError:myLet 未定义”
  console.log(myConst); // 抛出“ReferenceError:myConst 未定义”

  let myLet = "Hello World with let!";
  const myConst = "Hello World with const!";
}

foo();

在函数 foo 中,变量 myLet 和变量 myConst 均未被定义,所以在使用 console.log 方法输出时,它们均抛出了“ReferenceError:未定义变量”错误。

作用域

Javascript 中有几种类型的作用域,包括全局作用域、函数作用域和块级作用域。

全局作用域

在全局作用域中声明的变量可以在函数内外访问。全局作用域可以使用 window 对象来引用。

var globalVar = "Hello World with global!";

function foo() {
  console.log(globalVar); // 输出 "Hello World with global!"
}

foo();

在函数 foo 中,可以访问在全局作用域中声明的变量 globalVar

函数作用域

在函数内部声明的变量只能在该函数内部访问。函数作用域的作用范围从变量被声明的位置一直持续到函数结束。

function foo() {
  var functionVar = "Hello World with function!";

  console.log(functionVar); // 输出 "Hello World with function!"
}

foo();

console.log(functionVar); // 抛出“ReferenceError:functionVar 未定义”

在函数 foo 中,变量 functionVar 在函数作用域中被定义。在函数内部,可以访问该变量。在函数外部,试图访问该变量会抛出“ReferenceError:未定义变量”错误。

块级作用域

ES6 引入了块级作用域的概念,可以使用 letconst 关键字在块级作用域中定义变量。块级作用域的作用范围是从变量被定义的位置一直持续到块结束。

function foo() {
  if (true) {
    let blockVar = "Hello World with block!";
  }

  console.log(blockVar); // 抛出“ReferenceError:blockVar 未定义”
}

foo();

在函数 foo 中,变量 blockVarif 语句块中被定义。在该块级作用域内,可以访问该变量。在函数外部,试图访问该变量会抛出“ReferenceError:未定义变量”错误。

结论

在 Javascript 中,声明变量时会触发变量声明阶段,变量会被提升至其作用域的顶部。变量声明类型决定了它们的作用域。全局作用域的变量可以在函数内外访问,函数作用域的变量只能在该函数内部访问,块级作用域的变量只能在该块级作用域内访问。