在块级作用域内函数声明的问题

foo();
var a = true;
if(a){
  function foo(){console.log('a');}
}else{
  function foo(){console.log('b');}
}

在ES5中函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。但是,某些浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数,因此上面两种情况实际都能运行,不会报错。

在ES6环境内会报错,因为ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

ES6规则:

  • 允许在块级作用域内声明函数。
  • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
  • 同时,函数声明还会提升到所在的块级作用域的头部。

注意点:

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

// 函数声明语句
{
  let a = 'secret'
  function f() {
    return a
  }
}

// 函数表达式
{
  let a = 'secret'
  let f = function () {
    return a
  }
}

ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。

// 不报错
'use strict';
if (true) {
  function f() {}
}

// 报错
'use strict';
if (true)
  function f() {}

 

posted @ 2019-02-27 15:27  沧海的雨季  阅读(335)  评论(0编辑  收藏  举报