1. 程式人生 > >函數提升和變量提升,以及他們的優先級

函數提升和變量提升,以及他們的優先級

func scrip 有變 一個 函數聲明 logs 變量聲明 define 塊級作用域

一、變量提升

在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;
            

由此可見函數提升要比變量提升的優先級要高一些,且不會被變量聲明覆蓋,但是會被變量賦值之後覆蓋。

函數提升和變量提升,以及他們的優先級