变量声明提升和函数声明提升
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);
}
网友评论