Javascript 为什么Chrome在“中”的块内使用函数时仍然保持沉默;严格模式;?

Javascript 为什么Chrome在“中”的块内使用函数时仍然保持沉默;严格模式;?,javascript,node.js,google-chrome,ecmascript-6,Javascript,Node.js,Google Chrome,Ecmascript 6,我对JS“严格模式”相当陌生,当我使用以下代码时: function outer(){ "use strict"; var ctype; function inner(){ if(ctype!=undefined){ function hello1(){ console.log("hello1"); } hello1() }else {

我对JS
“严格模式”相当陌生,当我使用以下代码时:

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(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 这被认为是令人困惑的行为,因此在严格模式下被禁止,从而导致在节点中看到的错误

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

ECMAScript 6 这种行为更为有意,也更少令人困惑,因此在严格模式下是允许的


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

@DanD。谢谢,这意味着Chrome不使用我的代码,而是更改代码,然后在严格模式下进行检查?添加[node.js]标记,因为这个问题是将其行为与Chrome进行比较(而不是与规范或其他东西进行比较)。看起来像是一个bug。解析器应该在有机会运行之前抛出一个语法错误。甚至不需要调用,就像在这个更简单的演示中:ES6没有添加允许它的特性,是吗?由于一个块现在可以创建一个作用域,我想知道现在是否允许使用这种语法。@squint-Huh。。。根据,您是对的,ES6修改了
function
声明,使用块作用域而不是函数作用域。我以为他们只是在为新的构造使用块作用域,比如
let
/
const
/
class
。看起来我们有了答案。这个粗略的答案是基于对一些资源的快速浏览;我以前从未使用过这种行为,可能误解了它。如有任何澄清(或下文给出更好的答案),将不胜感激。(暗示,暗示,贬低)谢谢,但对不起,我没有完全明白你的意思。我的代码中没有使用任何ES6功能。我想我的情况是,即使我只使用ES5语法,但一旦我指定了
“严格模式”
,它在Chrome和Node@Kuan我明白,这很奇怪。以前,Chrome遵循ES5的规则。它现在开始遵循ES6中的一些规则,首先是严格模式。在代码中没有使用任何全新的ES6功能这一事实并不重要;Chrome仍将应用新的ES6规则,其中包括
函数
定义的新行为。这种新的行为允许它们以严格模式(不是在函数的顶层)进入块内部,而旧的行为没有这样做。(我想尝试改进我的答案,让它更清楚一点,但我必须去预约。)这是一个非常好和明智的功能。通过利用块作用域的新现实,消除了规范与实现之间的冲突。“在ECMAScript 6之前,函数声明的作用域将限定在包含函数的范围内。”需要明确的是:在ES5中,块内的函数声明实际上是一个语法错误,但大多数引擎决定接受这种或那种方式。例如,Chrome和Firefox实现了非常不同的行为。另见。
function main() {
  if (true) {
    function example() {};

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

  console.log(example); // function example() {}
}
function main() {
  'use strict';

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

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

  console.log(example); // ReferenceError: example is not defined
}