例子
var sayTruth =function(){console.log(2)}
function sayTruth(){console.log('1')};
sayTruth();
环境 | es5 | es5严格模式 | es6 node | es6 node严格模式 | es6浏览器 | es6浏览器严格模式 | babel |
---|---|---|---|---|---|---|---|
结果 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
例子
sayTruth();
function sayTruth(){console.log('1')};
环境 | es5 | es5严格模式 | es6 node | es6 node严格模式 | es6浏览器 | es6浏览器严格模式 | babel |
---|---|---|---|---|---|---|---|
结果 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
从前面两个例子可以简单看出 es6对函数提升恩es5保持一致
例子
if(1){
function sayTruth(){console.log('1')};
}
else{
function sayTruth(){console.log('2')};
}
sayTruth();
执行结果
环境 | es5 | es5严格模式 | es6 node | es6 node严格模式 | es6浏览器 | es6浏览器严格模式 | babel |
---|---|---|---|---|---|---|---|
结果 | 2 | not defined | 1 | not defined | 1 | not defined | not defined |
原因 | 变量提升 | 严格模式 | 严格模式 | 严格模式 | 严格模式 |
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。若改变了块级作用域内声明的函数的处理规则,显然会对老代码产生很大影响。为了减轻因此产生的不兼容问题,ES6规定,浏览器的实现可以不遵守上面的规定,允许有自己的行为方式。
- 允许在块级作用域内声明函数。
- 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
- 同时,函数声明还会提升到所在的块级作用域的头部。
例子
sayTruth();
if(1){
function sayTruth(){console.log('1')};
}
else{
function sayTruth(){console.log('2')};
}
环境 | es5 | es5严格模式 | es6 node | es6 node严格模式 | es6浏览器 | es6浏览器严格模式 | babel |
---|---|---|---|---|---|---|---|
结果 | 2 | not defined | not a function | not defined | not a function | not defined | not defined |
原因 | 变量提升 | 严格模式 | 严格模式 | 严格模式 | 严格模式 |
对于es6 等同于
var sayTruth ;
sayTruth();
if(1){
function sayTruth(){console.log('1')};
}
else{
function sayTruth(){console.log('2')};
}