1 回答

TA貢獻(xiàn)1893條經(jīng)驗 獲得超10個贊
ES5 規(guī)定,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明,不能在塊級作用域聲明
但是,瀏覽器沒有遵守這個規(guī)定,為了兼容以前的舊代碼,還是支持在塊級作用域之中聲明函數(shù)
ES6 引入了塊級作用域,明確允許在塊級作用域之中聲明函數(shù)。ES6 規(guī)定,塊級作用域之中,函數(shù)聲明語句的行為類似于let,在塊級作用域之外不可引用。
foo();
if (true) {
function foo() {
console.log('1111');
}
} else {
function foo() {
console.log('22222');
}
}
你的代碼如果在es5的環(huán)境下運行,就是你說的情況,但是在es6瀏覽器中為了兼容也做了如下如下規(guī)定(只在es6瀏覽器中)
允許在塊級作用域內(nèi)聲明函數(shù)。
函數(shù)聲明類似于var,即會提升到全局作用域或函數(shù)作用域的頭部。
同時,函數(shù)聲明還會提升到所在的塊級作用域的頭部
所以瀏覽器的 ES6 環(huán)境中,塊級作用域內(nèi)聲明的函數(shù),行為類似于var聲明的變量
因此你的代碼相當(dāng)于
foo();
var foo = undefined
if (true) {
function foo() {
console.log('1111');
}
} else {
function foo() {
console.log('22222');
}
}
應(yīng)該避免在塊級作用域內(nèi)聲明函數(shù)。如果確實需要,也應(yīng)該寫成函數(shù)表達(dá)式,而不是函數(shù)聲明語句
添加回答
舉報