第一部分 第4章 提升

变量声明提升和函数声明提升

var a=2;这段代码引擎在处理时会处理成

var a;
a=2;

所以

console.log(a);
var a=2;
//相当于
/**
 * var a;
 * console.log(a);
 * a=2;
 */

会输出undefined。
同样函数也会有函数声明提升:

foo();//undefined
function foo(){
    console.log(a);
    var a=2;
}

单数函数表达式不会提升:

foo();//TypeError
bar();//ReferenceError
var foo=function bar(){
    //...
}
//相当于
/**
 * var foo;
 * foo();//此时foo为undefined
 * bar();
 * foo=function bar(){
 *     ...
 * }
 */

值得注意的是,提升是单独的,即每个作用域都会进行提升操作,提升到所在作用域的最上方,而不是整个程序的最上方。

函数优先

函数会优先被提升,然后才是变量提升:

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

上面的代码相当于:

function foo(){
    console.log(1);
}
var foo;//重复声明,这一句被忽略
foo();
foo=function(){
    console.log(2);
}

尽管重复的var声明会被忽略,但是出现在后面的函数声明还是可以覆盖前面的:

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

你可能感兴趣的:(第一部分 第4章 提升)