Javascript 变量提升(hoisting)

什么是作用域(scoping)

在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用域的。也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。而如果该变量是定义在if 或者for这样的代码块中,它在代码块之外是可见的。另外,在JavaScript中,术语“全局变量”指的是定义在所有函数之外的变量,与之相对的是“局部变量”,所指的是在某个函数中的变量。其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行。

变量提升

在JavaScript代码运行之前其实是有一个编译阶段的。编译之后才是从上到下,一行一行解释执行。变量提升就发生在编译阶段,它把变量和函数的声明提升至作用域的顶端。(编译阶段的工作之一就是将变量与其作用域进行关联)。
所以对于代码var a =2;来说,编译器看到的是两行代码var a; a = 2;第一个语句是声明语句,在编译阶段处理。第二个语句是赋值语句,在运行阶段处理。

console.log(a); var a = 3;
// undefined
screenshot.png

为什么会出现undefined呢? 变量提升

 var x = 1;
    console.log(x); 
 if (true) {
   var x = 2;
   console.log(x); 
}
 console.log(x);
function foo() {
    var x = 1;
    if (x) {
        (function () {
            var x = 2;
            // some other code
        }());
    }
    console.log(x)
}
  1. 提升的部分只是变量声明,赋值语句和可执行的代码逻辑还保持在原地不动
  2. 提升只是将变量声明提升到变量所在的变量范围的顶端,并不是提升到全局范围
  3. 变量声明和函数声明都会得到变量提升,但函数声明会最先得到提升,然后是变量声明。
  4. 对于函数声明来说,如果定义了相同的函数变量声明,后定义的声明会覆盖掉先前的声明

以上部分也是变量提升的核心,一定要记住

你可能感兴趣的:(Javascript 变量提升(hoisting))