关于块级作用域的问题

{
    var a;
    function a () {}
} // Uncaught SyntaxError: Identifier 'a' has already been declared

ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

而在es6的浏览器中,为了减轻对老代码的影响,函数的申明类似于var,所以我的理解是

{
    var a = function () {};
    var a;
} // 并不会出现问题

请问,造成上面错误的原因是什么,谢谢!

阅读 3.1k
4 个回答

我个人的理解是,在块级作用域中,发生了类似于下面的转换:

{
    var a;
    const a = function () {}
}

ES6 规定,块级作用域之中,函数声明语句的行为类似于let, 在块级作用域之外不可引用
但在浏览器的实现中,为了减轻对老代码的影响,函数的申明类似于let, 但是在块级作用域外可以引用

刚看了下规范,理解的可能会不太对,规范只规范了块作用域中浏览器对函数声明的实现。
就是说规范不允许块作用域中声明函数,但是浏览器为了兼容可以允许,但是其他的规范还是要遵守的,比如函数声明不允许重复。

{
  a()
  function a() {console.log(1)}
}

浏览器允许声明,并按照var的提升方式来处理(就还是es5里函数声明提升的那一套东西)。
但是别的规范还是要遵守,比如不允许重复声明,你再加个var a就报错了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题