为了账号安全,请及时绑定邮箱和手机立即绑定

js函数提升问题?

js函数提升问题?

白衣染霜花 2018-12-20 18:14:43
foo();if (true) {  function foo() {    console.log('1111');  }} else {    function foo() {      console.log('22222');  }}在我理解之中,函数提升应该会忽视if和else的大括号,然后第二个foo覆盖第一个foo,最后打印222的么?为什么报错了
查看完整描述

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');

  }

}

应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句


查看完整回答
反对 回复 2019-01-08
  • 1 回答
  • 0 关注
  • 386 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号