声明提升
所有使用var声明的变量都会提升:提升到作用域一开始的位置被声明,该赋值的位置再赋值
var a = 10;
console.log(a) //10
console.log(a) //undefined
var a = 10;
上面的相当于将a提升到作用域最上面,而赋值还是在最后面:
var a;
console.log(a); //undefined
a = 10;
再看下面一个例子:
function fn(){
var a = 10;
console.log(a); //10
}
fn()
function fn(){
console.log(a); //undefined
var a = 10;
console.log(a); //10
}
fn()
这是因为a被声明到前面去,但是未被赋值,所以第一个是undefined,第二个是10,相当于:
function fn(){
var a;
console.log(a); //undefined
a = 10;
console.log(a); //10
}
fn()
函数提升
function fn(){
console.log('hello')
}
fn()
//或
fn()
console.log(fn) //得到整个函数fn
function fn(){
console.log('hello')
}
//可以用console.log()来看是否提升
console.log(fn) //得到整个函数fn
function fn(){
console.log('hello')
}
fn()
当函数遇到变量时:
// fn() //fn is not a function
var fn = function(){
console.log('world')
}
fn() //world
赋值式创建函数中,不存在函数提升,只有var的变量提升
再将上面的例子进行结合,那么有会发现什么?
console.log(a); //ƒ a(){}
var a = 10;
function a(){}
console.log(a) //10
//上面的等价于下面的,function把上面的a覆盖了
var a;
function a(){}
console.log(a); //ƒ a(){}
a = 10;
console.log(a) //10
再来一个问题,如果将变量与函数的位置换以下呢?还是看下面的代码说话吧
console.log(a); //ƒ a(){}
function a(){}
var a = 10;
console.log(a) //10
可以看出结果还是一样,其实提升并不是跟出现的顺序有关,而是使用var声明的变量会提升的更高,提升的更高并不意味权限更高,而是有可能会被覆盖