在"严格模式"下使用块内功能时,为什么Chrome仍然保持静音?

Kua*_*uan 10 javascript google-chrome node.js ecmascript-6

我是JS的新手"strict mode";,当我使用代码时:

function outer(){

"use strict";
    var ctype;

    function inner(){

        if(ctype!=undefined){
            function hello1(){
                console.log("hello1");
            }
            hello1()
        }else {
            function hello2(){
                console.log("hello2");
            }
            hello2();
        }

    }

    return inner;

}

var inner = outer();

inner();
Run Code Online (Sandbox Code Playgroud)

我想知道为什么Chrome(第49版)没有给出任何错误,但是Node.js可以给出" SyntaxError:在严格模式代码中,函数只能在顶级或者在另一个函数中声明. "

此表指出我的Chrome应报告错误.

小智 10

您正在使用的Node.js版本(0.12.9)使用较旧版本的V8 JavaScript引擎(3.28.71.19),该版本不遵循ECMAScript 6中添加的新功能声明范围规则.您可以使用Chrome的版本re using(49)使用新版本的V8(4.9.385),它支持新规则,至少在严格模式下.

在ECMAScript 6之前,函数声明将作用于包含函数.例如:

ECMAScript 5

function main() {
  if (true) {
    function example() {};

    console.log(example); // function example() {}
  }

  console.log(example); // function example() {}
}
Run Code Online (Sandbox Code Playgroud)

这被认为是令人困惑的行为,因此在严格模式下被禁止,导致您在Node中看到的错误.

在ECMAScript 6中,函数声明的范围改为最近的块.块是包含两个括号({ ... })之间的任何一系列语句,例如跟在if语句之后.

ECMAScript 6

function main() {
  'use strict';

  if (true) {
    function example() {};

    console.log(example); // function example() {}
  }

  console.log(example); // ReferenceError: example is not defined
}
Run Code Online (Sandbox Code Playgroud)

这种行为更有意,更少混淆,因此在严格模式下是允许的.

但是,测试这一点有点令人困惑,因为Chrome目前仅在严格模式下启用某些ES6规则.

  • 这是一个很好的和明智的功能.通过利用块范围的新现实,放弃规范与实现之间的冲突. (2认同)