JS变量提升Hoisting

变量提升

js和其他语言一样,都要经历编译和执行阶段。而js在编译阶段的时候,会搜集所有的变量声明并且提前声明变量,而其他的语句都不会改变他们的顺序,因此,在编译阶段的时候,第一步就已经执行了,而第二步则是在执行阶段执行到该语句的时候才执行。

https://blog.csdn.net/qq_42606051/article/details/82016733

JavaScript 仅提升声明,而不提升初始化。如果你先使用的变量,再声明并初始化它,变量的值将是 undefined。

https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting

// Example 1 - Does not hoist
var x = 1;                 // 声明 + 初始化 x
console.log(x + " " + y);  // '1 undefined'
var y = 2;                 // 声明 + 初始化 y

// Example 2 - Hoists
var num1 = 3;                   // Declare and initialize num1
num2 = 4;                       // Initialize num2
console.log(num1 + " " + num2); //'3 4'
var num2;                       // Declare num2 for hoisting

// Example 3 - Hoists
a = 'Cran';              // Initialize a
b = 'berry';             // Initialize b
console.log(a + "" + b); // 'Cranberry'
var a, b;                // Declare both a & b for hoisting

foo();
function foo() {
    console.log('foo');
}
var foo = 2;
foo();
 
function foo() {
    console.log('1');
}
 
function foo() {
    console.log('2');
}

// 2。有多个函数声明的时候,是由最后面的函数声明来替代前面的。

总结:

  1. js会将变量的声明提升到js顶部执行,因此对于这种语句:var a = 2,其实上js会将其分为var a; 和a = 2; 两部分,并且将var a这一步提升到顶部执行。
  2. 变量提升的本质是由于js引擎在编译的时候就将所有的变量声明了,因此在执行的时候,所有的变量都已经完成声明。
  3. 当有多个同名变量声明的时候,函数声明会覆盖其他的声明。如果有多个函数声明,则是由最后的一个函数声明覆盖之前所有的声明。