foo();
if (true) {
function foo() {
console.log('1111');
}
} else {
function foo() {
console.log('22222');
}
}
在我理解之中,函数提升应该会忽视if和else的大括号,然后第二个foo覆盖第一个foo,最后打印222的么?
为什么报错了
foo();
if (true) {
function foo() {
console.log('1111');
}
} else {
function foo() {
console.log('22222');
}
}
在我理解之中,函数提升应该会忽视if和else的大括号,然后第二个foo覆盖第一个foo,最后打印222的么?
为什么报错了
昨天刚好在书上又看到了类似的解释。
通过function xxx() {}定义函数被称之为‘函数声明语句’,ECMAScript规范规定,‘函数声明语句’只能出现在全局代码里或者其他函数体内,但不允许出现在循环,条件判断,try/catch等语句中。但这只是规范,每个浏览器厂商的具体实现会有差异。
var xxx = function() {}这种形式定义函数被称之为‘函数定义表达式’,‘函数定义表达式’没有任何限制,他可以出现在代码的任何地方。
在ES6之前,只有Global Scope Function Scope
原因是在ES6
引入了Block Scope
你运行下 下面代码就很清楚了
console.log(foo) // cause of Block Scope
{
console.log(foo) // function hoisting
function foo() {}
}
console.log(foo) // function can create global properties
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
你的代码如果在es5的环境下运行,就是你说的情况,但是在es6浏览器中为了兼容也做了如下如下规定(只在es6浏览器中)
所以浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于var声明的变量
因此你的代码相当于
应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句