变量提升

变量和函数在内的所有声明都会在任何代码被执行前首先被处理,这个过程就好像变量和函数声明从他们的代码中出现的位置被移动到了最上面,这个过程就叫做提升。但是只有声明会被提升,而赋值或其他运算逻辑会留在原地,注意函数声明会被提前,但是函数表达式不会被提前。

  1. console.log(a);
  2. var a = 1;
  3. // 出现undefined,而不是a is not defined

每个作用域都会进行提升操作.

  1. console.log(v1);
  2. var v1 = 100;
  3. function foo() {
  4. console.log(v1);
  5. var v1 = 200;
  6. console.log(v1);
  7. }
  8. foo();
  9. console.log(v1);

在函数作用域中就会出现变量的提升,上述代码的翻译顺序如下:

  1. function foo() {
  2. var v1;
  3. console.log(v1);
  4. v1 = 200;
  5. console.log(v1);
  6. }
  7. var v1;
  8. console.log(v1);
  9. v1 = 100;
  10. foo();
  11. console.log(v1);
  12. //答案是:undefined;undefined;200;100;

函数优先

函数声明和变量声明都会被提升。但是函数会被首先被提升,然后才是变量,

  1. foo();//1
  2. var foo;
  3. function foo(){
  4. console.log(1);
  5. }
  6. foo = function(){
  7. console.log(2)
  8. }

会输出1而不是2,这个代码片段会被引擎理解为如下形式:

  1. function foo(){
  2. console.log(1)
  3. }
  4. foo();
  5. foo = function(){
  6. console.log(2)
  7. }

var foo 尽管出现在function foo()。。。的声明之前,但是他是重复声明,所以会被忽略。