为什么函数被描述为块作用域

时间:2017-01-23 10:25:29

标签: javascript ecmascript-6

我在ES6上读这本书,有以下内容:   功能声明......         像块一样是块状的。   在全局对象中创建属性   (在全球范围内),如var。   悬挂:独立于何处   在其范围中提到了函数声明,它始终是创建的   在范围的开头。    AFAIK,功能一直是功能范围。我认为ES6中的某些内容可能已经发生变化,但是没有: function a(){     如果是真的) {         //在块内定义并被提升到该块的顶部         Z();         function z(){console.log('z')}     }     Z(); } //但也被提升到功能范围 一个(); //工作正常 实际上,它们似乎是块范围的: function a(){     if(false){         //在块内定义并被提升到该块的顶部         Z();         function z(){console.log('z')}     }     Z(); //错误 } 那么它在ES6中有所改变吗?

1 个答案:

答案 0 :(得分:5)

  

AFAIK,函数一直是函数作用域。我认为ES6中可能有些变化

确实如此:在ES2015之前,规范并没有涵盖块内声明的功能。支持它们是允许的扩展,但不是规范的一部分。

因此,规范必须跳过箍,特别是在浏览器的松散模式下。

严格模式下,您将在兼容引擎上找到函数声明确实是块作用域的:



"use strict";

function test() {
  if (true) {
    function foo() {
      console.log("foo called");
    }
  }
  try {
    foo(); // ReferenceError
  } catch (e) {
    console.log("Error: " + String(e));
  }
}
test();




在兼容的JavaScript引擎(例如任何最新版本的Chrome中的V8或任何最新版本的Firefox中的SpiderMonkey)中,您将获得ReferenceError上面的内容。