为什么Chrome在“严格模式”下使用块内的功能时仍然保持沉默

Why Chrome still keep silent when using functions inside blocks in "strict mode"?

本文关键字:功能 沉默 Chrome 模式 严格模式 为什么      更新时间:2023-09-26

当我使用如下代码时,我对 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();

我想知道为什么 Chrome(ver 49) 没有给出错误,但 Node.js 可以给出"语法错误:在严格模式代码中,函数只能在顶层声明或立即在另一个函数中声明。

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

你正在使用的 Node.js 版本 (0.12.9) 使用旧版本的 V8 JavaScript 引擎 (3.28.71.19),该引擎不遵循 ECMAScript 6 中添加的新函数声明范围规则。您使用的 Chrome 版本 (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() {}
}

这被认为是令人困惑的行为,因此在严格模式下被禁止,从而导致您在 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
}

这种行为更有意且不那么令人困惑,因此在严格模式下是允许的。

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