例子
var sayTruth =function(){console.log(2)}
function sayTruth(){console.log('1')};
sayTruth();
| 環(huán)境 | es5 | es5嚴(yán)格模式 | es6 node | es6 node嚴(yán)格模式 | es6瀏覽器 | es6瀏覽器嚴(yán)格模式 | babel |
|---|---|---|---|---|---|---|---|
| 結(jié)果 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
例子
sayTruth();
function sayTruth(){console.log('1')};
| 環(huán)境 | es5 | es5嚴(yán)格模式 | es6 node | es6 node嚴(yán)格模式 | es6瀏覽器 | es6瀏覽器嚴(yán)格模式 | babel |
|---|---|---|---|---|---|---|---|
| 結(jié)果 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
從前面兩個(gè)例子可以簡(jiǎn)單看出 es6對(duì)函數(shù)提升恩es5保持一致
例子
if(1){
function sayTruth(){console.log('1')};
}
else{
function sayTruth(){console.log('2')};
}
sayTruth();
執(zhí)行結(jié)果
| 環(huán)境 | es5 | es5嚴(yán)格模式 | es6 node | es6 node嚴(yán)格模式 | es6瀏覽器 | es6瀏覽器嚴(yán)格模式 | babel |
|---|---|---|---|---|---|---|---|
| 結(jié)果 | 2 | not defined | 1 | not defined | 1 | not defined | not defined |
| 原因 | 變量提升 | 嚴(yán)格模式 | 嚴(yán)格模式 | 嚴(yán)格模式 | 嚴(yán)格模式 |
ES6 引入了塊級(jí)作用域,明確允許在塊級(jí)作用域之中聲明函數(shù)。ES6 規(guī)定,塊級(jí)作用域之中,函數(shù)聲明語(yǔ)句的行為類(lèi)似于let,在塊級(jí)作用域之外不可引用。若改變了塊級(jí)作用域內(nèi)聲明的函數(shù)的處理規(guī)則,顯然會(huì)對(duì)老代碼產(chǎn)生很大影響。為了減輕因此產(chǎn)生的不兼容問(wèn)題,ES6規(guī)定,瀏覽器的實(shí)現(xiàn)可以不遵守上面的規(guī)定,允許有自己的行為方式。
- 允許在塊級(jí)作用域內(nèi)聲明函數(shù)。
- 函數(shù)聲明類(lèi)似于var,即會(huì)提升到全局作用域或函數(shù)作用域的頭部。
- 同時(shí),函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部。
例子
sayTruth();
if(1){
function sayTruth(){console.log('1')};
}
else{
function sayTruth(){console.log('2')};
}
| 環(huán)境 | es5 | es5嚴(yán)格模式 | es6 node | es6 node嚴(yán)格模式 | es6瀏覽器 | es6瀏覽器嚴(yán)格模式 | babel |
|---|---|---|---|---|---|---|---|
| 結(jié)果 | 2 | not defined | not a function | not defined | not a function | not defined | not defined |
| 原因 | 變量提升 | 嚴(yán)格模式 | 嚴(yán)格模式 | 嚴(yán)格模式 | 嚴(yán)格模式 |
對(duì)于es6 等同于
var sayTruth ;
sayTruth();
if(1){
function sayTruth(){console.log('1')};
}
else{
function sayTruth(){console.log('2')};
}