JavaScript this关键字
JavaScript Promise 

JavaScript Hoisting

JavaScript 中的变量提升(Hoisting)是指在代码执行过程中,JavaScript 解释器将变量声明(但不包括初始化)和函数声明提升到当前作用域的顶部。这意味着在代码执行之前,变量和函数的声明会被提升到当前作用域的顶部,但是赋值操作并不会提升。


变量提升

变量的声明会被提升,但是赋值不会提升。举个例子:

console.log(myVar); // 输出: undefined
var myVar = 10;
console.log(myVar); // 输出: 10


实际上,上述代码在执行时会被解释为:

var myVar; // 变量声明被提升
console.log(myVar); // 输出: undefined
myVar = 10; // 赋值操作保留在原处
console.log(myVar); // 输出: 10


函数提升

与变量提升类似,函数声明(不包括函数表达式)也会被提升到当前作用域的顶部。例如:

hello(); // 输出: Hello, world!
function hello() {
  console.log('Hello, world!');
}


上述代码在执行时,实际上会被解释为:

function hello() {
  console.log('Hello, world!');
}
hello(); // 输出: Hello, world!


注意事项

只提升声明,不提升赋值:

console.log(myVar); // 输出: undefined
var myVar = 10;

变量 myVar 的声明被提升,但赋值操作 myVar = 10 并没有被提升,因此第一行输出的是 undefined。


函数优先于变量:

 如果同时存在同名变量和函数声明,函数声明会优先于变量提升。

var myVar = 'global';
function myFunc() {
  console.log(myVar); // 输出: undefined
  var myVar = 'local';
  console.log(myVar); // 输出: local
}
myFunc();

在 myFunc() 函数中,变量 myVar 被声明并提升,但在函数内部,函数声明优先于变量声明。因此,第一个 console.log(myVar) 输出 undefined,而第二个 console.log(myVar) 输出 local。


函数表达式不会提升: 

函数表达式(如使用 var, let, const 声明的函数)不会被提升,只有函数声明会被完全提升到顶部。

console.log(myFunc); // 输出: undefined
var myFunc = function() {
  console.log('Function expression');
};

在上面的例子中,myFunc 是一个函数表达式,不会被提升,因此第一行输出 undefined。


总结

JavaScript 的变量提升使得在代码执行之前,可以访问变量和函数的声明。了解和理解变量提升的工作原理有助于编写更清晰、更具可维护性的 JavaScript 代码,同时避免由于提升机制导致的潜在错误。