js 函式宣告提升和變數提升
阿新 • • 發佈:2018-11-11
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()
歡迎關注、點贊