📅  最后修改于: 2023-12-03 15:37:50.235000             🧑  作者: Mango
在 Javascript 中,声明变量时会触发变量声明阶段,也称为“提升阶段”,在这个阶段,变量会被提升至其作用域的顶部。
var
声明一个使用 var
关键字的变量时,它会被提升到函数作用域或全局作用域的顶部,取决于它是在函数内还是在全局作用域中声明的。
function foo() {
console.log(myVar); // 输出 "undefined"
var myVar = "Hello World!";
}
foo();
变量 myVar
在函数 foo
中被声明,但在使用 console.log
方法输出时,它的值为 undefined
。这是因为代码在进入函数的执行阶段时,变量 myVar
被提升到了函数作用域的顶部。所以,console.log
方法在变量被赋值之前被调用了。
let
和 const
使用 let
或 const
关键字声明的变量会被提升到它们被定义的块级作用域的顶部。但是,它们不会被初始化,直到声明被执行。
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 引入了块级作用域的概念,可以使用 let
或 const
关键字在块级作用域中定义变量。块级作用域的作用范围是从变量被定义的位置一直持续到块结束。
function foo() {
if (true) {
let blockVar = "Hello World with block!";
}
console.log(blockVar); // 抛出“ReferenceError:blockVar 未定义”
}
foo();
在函数 foo
中,变量 blockVar
在 if
语句块中被定义。在该块级作用域内,可以访问该变量。在函数外部,试图访问该变量会抛出“ReferenceError:未定义变量”错误。
在 Javascript 中,声明变量时会触发变量声明阶段,变量会被提升至其作用域的顶部。变量声明类型决定了它们的作用域。全局作用域的变量可以在函数内外访问,函数作用域的变量只能在该函数内部访问,块级作用域的变量只能在该块级作用域内访问。