JS中变量提升与函数提升及其优先级

6,387 阅读1分钟

为什么要进行变量提升和函数提升

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())