为什么Chrome在“严格模式”下使用块内的功能时仍然保持沉默
Why Chrome still keep silent when using functions inside blocks in "strict mode"?
当我使用如下代码时,我对 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规则。
相关文章:
- 添加文字和评论功能更新Div
- JavaScript打印功能使日历停止工作
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何防止网页加载后自动启动功能
- 除修剪外的其他功能
- 悬停功能触发器
- 使用angularjs向浏览器发送servlet响应(下载功能)
- 删除CKEditor工具栏按钮,但不删除功能
- 异步facebook功能
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- jQuery滚动功能只工作一次
- Graphiti中是否有任何工具提示功能
- React redux初始化功能,无论状态变化如何
- 在哪里可以学习ECMAScript标准中尚未包含的JavaScript功能
- 正在获取select上的功能id
- Rhino打印功能
- 使用(navigator.geolocation)检测浏览器功能错误
- 主体单击删除功能上的输入框宽度
- JQuery使用相同的功能自动完成各种输入文本
- 为什么Chrome在“严格模式”下使用块内的功能时仍然保持沉默