函数提升和变量提升,以及他们的优先级

Posted oxiaojiano

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数提升和变量提升,以及他们的优先级相关的知识,希望对你有一定的参考价值。

一、变量提升

在ES6之前,javascript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。

(1) 创建函数有两种形式,一种是函数声明,另外一种是函数字面量,只有函数声明才有变量提升

console.log(a)  // f a() { console.log(a) }
console.log(b) //undefined
    
function a() {
        console.log(a) 
}

var b = function(){
        console.log(b)
}

相当于

var a = ‘function‘
var b
console.log(a)
console.log(b)

(2)变量提升

console.log(c);   //undefined
var c = "第一次没打印出来,第二次才出来";
console.log(c);   //第一次没打印出来,第二次才出来
function fn(){
        console.log(d); //undefined
        var d = ‘和前面的一样啊‘;
        console.log(d); //和前面的一样啊
}

fn();

其实,就相当于

var c ;
console.log(c)
c = " xxxx "
console.log(c)

二、函数提升与变量提升的优先级

console.log(a);    // f a() {console.log(10)}
console.log(a());    //  undefined
var a = 3;

function a() {
        console.log(10) //10
}
console.log(a)   //3
a = 6;
console.log(a());  //a is not a function;

原理 :

    var a = funtion () {
        console.log(10)
    }
    var a;
    console.log(a);    // f a() {console.log(10)}
    console.log(a());  //  undefined

    a = 3;
    console.log(a)   //3
    a = 6;
    console.log(a());   //a() is not a function;
            

由此可见函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。

以上是关于函数提升和变量提升,以及他们的优先级的主要内容,如果未能解决你的问题,请参考以下文章

一个例子,变量提升和函数提升就是这么简单!

变量提升和函数提升

JavaScript之预编译与变量提升windowAOGOreturnif

javascript中函数声明变量声明以及变量赋值之间的关系与影响

JavaScript错题记录变量定义提升this指针指向运算符优先级原型继承全局变量污染对象属性及原型属性优先级

深入理解变量声明提升和函数声明提升