JS 中的变量提升指的是在代码执行前,JS 引擎会将变量和函数的声明提升到代码顶部,但是不会提升赋值操作。
在变量提升之后,函数的声明会优先于变量的声明,因此在代码中可以先使用函数再声明它。
例如:
console.log(a); // undefined
var a = 1;
foo(); // "hello"
function foo() {
console.log("hello");
}
在上面的代码中,变量 a 和函数 foo 的声明都被提升到了代码顶部。所以在第一行代码 console.log(a); 中,变量 a 的值为 undefined。在第二行代码 var a = 1; 中,变量 a 被赋值为 1。在第四行代码 foo(); 中,函数 foo 被调用并打印出了 "hello"。
需要注意的是,只有声明会被提升,而赋值操作不会被提升。因此,在下面的代码中,变量 b 的值为 undefined,而不是 1:
console.log(b); // undefined
b = 1;
在实际开发中,应尽量避免依赖变量提升,以免出现不可预期的行为。
另外,需要注意的是,使用 let 和 const 声明的变量和 class 声明的类不会被提升,因此在使用它们之前必须先声明。例如:
console.log(c); // ReferenceError: c is not defined
let c = 1;
console.log(new MyClass()); // ReferenceError: MyClass is not defined
class MyClass {}
在上面的代码中,变量 c 和类 MyClass 都没有被提升,因此在使用它们之前必须先声明。
总结一下,变量提升是 JS 中的一种机制,它将变量和函数声明提升到代码顶部,但不会提升赋值操作。需要注意的是,使用 let 和 const 声明的变量和 class 声明的类不会被提升,因此在使用它们之前必须先声明。
此外,还需要注意在函数内部的变量提升。在函数内部,变量和函数的声明同样会被提升到函数顶部,但是不会影响函数外部的变量和函数。例如:
function foo() {
console.log(a); // undefined
var a = 1;
console.log(a); // 1
}
foo();
console.log(a); // ReferenceError: a is not defined
在上面的代码中,函数 foo 内部的变量 a 被提升到函数顶部,并在第一个 console.log(a) 中打印出了 undefined。在第二个 console.log(a) 中,变量 a 被赋值为 1 并打印出了 1。在函数外部的 console.log(a) 中,由于变量 a 只存在于函数内部,因此会报错。
总的来说,变量提升是 JS 中的一种机制,它将变量和函数声明提升到代码顶部,但不会提升赋值操作。需要注意的是,在函数内部同样存在变量提升,并且不会影响函数外部的变量和函数。在实际开发中,应尽量避免依赖变量提升,以免出现不可预期的行为。