为什么要进行变量提升和函数提升
JS引擎在读取js代码的过程中,分为两步。第一个步骤是整个js代码的解析读取,第二个步骤是执行。在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面。
1.变量提升
在ES6出来之前,JS并没有块级作用域这一说,只有全局作用域和局部作用域。变量提升指的是使用var声明的变量提升到他所在的作用域的最顶端。
console.log(a) //undefined
var a='我是谁'
console.log(a) //'我是谁'
它的过程就相当于
var a;
console.log(a);
a='我是谁'
console.log(a)
2.函数提升
函数提升只针对具名函数,而对于赋值的匿名函数,并不会存在函数提升。
console.log(a); // f a()
console.log(b); //undefined
function a(){
console.log('hello')
}
var b=function(){
console.log('world')
}
它的过程就相当于
var a=function (){
console.log('hello')
}
var b;
console.log(a);
console.log(b);
3.变量提升与函数提升的优先级
函数提升优先级高于变量提升,且不会被同名变量声明覆盖,但是会被变量赋值后覆盖。而且存在同名函数与同名变量时,优先执行函数。
console.log(a); //f a()
console.log(a()); //1
var a=1;
function a(){
console.log(1);
}
console.log(a); //1
a=3
console.log(a()) //a not a function
它的过程就相当于
var a=function (){ //声明一个变量a指向
console.log(1)
}
var a;
console.log(a) //如果a不优先执行含函数,这里是返回undefined;
console.log(a())
a=1 //这里函数与变量
console.log(a)
a=3
console.log(a())