1、ES5中規(guī)定:函數(shù)只能在頂層作用域和函數(shù)作用域中聲明,不能在塊級作用域中聲明
// 情況一
if (true) {
function f() {}
}
// 情況二
try {
function f() {}
} catch(e) {
// ...
}
上面兩種函數(shù)聲明,根據(jù) ES5 的規(guī)定都是非法的。但是,瀏覽器沒有遵守這個(gè)規(guī)定,為了兼容以前的舊代碼,還是支持在塊級作用域之中聲明函數(shù),因此上面兩種情況實(shí)際都能運(yùn)行,不會報(bào)錯(cuò)。
2、ES6 引入了塊級作用域,明確允許在塊級作用域之中聲明函數(shù)。ES6 規(guī)定,塊級作用域之中,函數(shù)聲明語句的行為類似于let,在塊級作用域之外不可引用。
function f() { console.log('I am outside!'); }
(function () {
if (false) {
// 重復(fù)聲明一次函數(shù)f
function f() { console.log('I am inside!'); }
}
f();
}());
上面代碼在 ES5 中運(yùn)行,會得到“I am inside!”,因?yàn)樵趇f內(nèi)聲明的函數(shù)f會被提升到函數(shù)頭部,實(shí)際運(yùn)行的代碼如下。
// ES5 環(huán)境
function f() { console.log('I am outside!'); }
(function () {
function f() { console.log('I am inside!'); }
if (false) {
}
f();
}());