1. 程式人生 > >js 函式宣告提升和變數提升

js 函式宣告提升和變數提升

1. 函式宣告提升

func()
function func () {
}

上例不會報錯,正是因為 ‘函式宣告提升’,即將函式宣告提升(整體)到作用域頂部(注意是函式宣告,不包括函式表示式),實際提升後結果同下:

// 函式宣告提升
function func () {
}
func()

2. 變數宣告提升(只有var宣告的變數才有變數提升,let、const無)

1. console.log(num)
   var num = 10

2. console.log(func)
   var func = function () {
   }

上兩例均會打印出 'undefined',變數宣告提升會將變數宣告提升到作用域頂部,但變數函式表示式、變數定義都只會提升宣告部分,不會提升賦值部分,實際提升後結果如下:

1. var num 
   console.log(num)
   num = 10

2. var func
   console.log(func)
   func = function () {
   }

3. 進階舉例(IIFE、兩者優先順序、區域性與全域性變數):

    ①

var num = 1
(function () {
    console.log(num)
    var num = 2
})()

上例將打印出 'undefined',此處為IIFE(立即呼叫函式表示式)結合變數提升,IIFE會產生一個區域性作用域,該作用域內建立的變數只在該塊內有效,外界無法訪問,實際提升後結果如下:

var num = 1
(function () {
    var num
    console.log(num)
    num = 2
})()

     ②

var func = 10
console.log(func && typeof(func))
function func () {
}

上例將輸出 ‘number’,原因是 函式宣告提升優先於變數提升,函式宣告被覆蓋,實際提升後結果如下:

function func () {
}
var func = 10
console.log(func && typeof(func))

    ③

num = 10
function func () {
    window.num = 5
    console.log(num)
    var num
    console.log(window.num)
}
func()

上例將會分別打印出 'undefined'、'5',第一處為區域性變數,第二處為全域性變數,實際提升後結果如下:

function func () {
    var num
    window.num = 5
    console.log(num)
    console.log(window.num)
}
var num
num = 10
func()

 

歡迎關注、點贊