1 回答

TA贡献1893条经验 获得超10个赞
ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
foo();
if (true) {
function foo() {
console.log('1111');
}
} else {
function foo() {
console.log('22222');
}
}
你的代码如果在es5的环境下运行,就是你说的情况,但是在es6浏览器中为了兼容也做了如下如下规定(只在es6浏览器中)
允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部
所以浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于var声明的变量
因此你的代码相当于
foo();
var foo = undefined
if (true) {
function foo() {
console.log('1111');
}
} else {
function foo() {
console.log('22222');
}
}
应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句
添加回答
举报