先上总结:定义提升,赋值不会提升
大家记住这句话,接下来我们开讲:
例1
console.log(a)
var a = 2;
输出undefined,它的实际执行过程:
var a;
console.log(a)
a = 2;
这是最简单的例子,var a;是定义的过程,而a = 2是赋值过程
例2(难一diudiu)
foo();
function foo(){
console.log(a);
var a=2;
}
输出undefined,它的实际执行过程:
function foo(){
var a;
console.log(a);
a = 2;
}
foo();
两点:
- 每个作用域内都会进行变量提升
- 函数声明会被提升
例3(再难一diudiu)
foo() //不是ReferenceError,而是TypeError
var foo = function(){
}
报错不是ReferenceError,而是TypeError,它的实际执行过程:
var foo;
foo()
foo = function(){
}
foo已存在,但为复制,所以报错TypeError: aa is not a function
例4(你可能会疑惑)
foo();
function foo(){
console.log(111);//111
}
foo() //TypeError: foo is not a function
var foo = function(){
console.log(111);
}
为啥第二个会报错呢???
函数声明会提升,函数表达式不会提升
不懂什么是函数声明,什么是函数表达式,可以去看我的另一篇博客:函数作用域