我对 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(版本 49)没有给出错误,但 Node.js 可以给出“SyntaxError:在严格模式代码中,函数只能在顶层或直接在另一个函数中声明。"
这张表 http://caniuse.com/#feat=use-strict指出我的 Chrome 应该报告错误。
您正在使用的 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() {}
}
这被认为是令人困惑的行为,因此在严格模式下被禁止,从而导致您在 Node.js 中看到的错误。
在 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 规则。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)