声明提升hoisting

js是脚本语言, 其执行过程是翻译过程. 不过JS在执行每一段代码之前, 都会进行预编译.

预编译

在js中, 预编译的一个表现为, js在执行每一段JS代码之前, 都会优先处理var关键字和function关键字.

在调用函数之前, 会先创建一个活动对象, 然后搜寻这个函数中的局部变量定义, 和函数定义, 再将变量名和函数名作为这个活动对象的同名属性. 对于局部变量定义, 变量的值会在真正执行的时候才会计算, 此时只是简单地赋值为undefined.

代码实例

var scope = 'global';

var func = function(){
    console.log(scope); // undefined
      var scope = 'function';
    console.log(scope); // 'function'
}

func();

上面的代码等价于

var scope = 'global';

var func = function(){
    var scope;  // 提升!
    console.log(scope); // undefined
      scope = 'function';
    console.log(scope); // 'function'
}

func();

上面这个过程, 也叫变量提升, 或声明提升, 看起来就像是所有的变量和函数都被移到了函数的顶部预先被声明了.

所以蝴蝶书推荐, 函数中如果要定义某些变量, 不妨在函数的顶部一起声明了.