块级作用域

函数与块级作用域

ES5规定,函数只能在顶层作用域和函数作用域(闭包)之中声明,不能在块级作用域中声明。

// 情况一
if (true) {
  function f() {}
}

// 情况二
try {
  function f() {}
} catch(e) {
  // ...
}

上述的声明都是非法的。但是为了兼容旧的代码,上述情况实际都可以运行,不会报错。

function f() { console.log('I am outside!'); }

(function () {
  if (false) {
    // 重复声明一次函数f
    function f() { console.log('I am inside!'); }
  }

  f();
}());

上例中结果会输出I am inside,实际函数会被提升到函数作用域头部,被ES5转化为

然而会在ES6环境下报错,而不是I am outside!,原因是ES6环境中,块级作用域声明的函数,行为类似var声明的变量,实际运行代码如下:

因此,如果一定要在块级作用域中声明函数,应该写成函数表达式,而不是函数声明语句。

方括号与块级作用域

ES6的块级作用域必须有大括号,不然JavaScript就认为不存在块级作用域

最后更新于

这有帮助吗?