严格模式是不是禁止语句级函数声明?

Posted

技术标签:

【中文标题】严格模式是不是禁止语句级函数声明?【英文标题】:Does strict mode prohibit statement level function declarations?严格模式是否禁止语句级函数声明? 【发布时间】:2015-10-29 22:12:07 【问题描述】:
"use strict";

if (true) 
  function foo() 
  

phpStorm 中,此代码显示错误:

禁止不在程序或函数顶层的函数语句

但是,Chrome 很高兴地执行它,即使在调试器中并且没有任何控制台输出。

现在是禁止还是不禁止?

【问题讨论】:

不应该被允许。 Why Chrome still keep silent when using functions inside blocks in “strict mode”?的可能重复 【参考方案1】:

是的,在 ES5 中它们是被禁止的(在严格模式下,所有实现都会抛出)。另请参阅Kangax' great article 了解草率模式下的函数语句。

然而,在 ES6 中,它们是具有新语义的块级函数声明。另见What are the precise semantics of block-level functions in ES6?。这似乎是 Chrome 在这里实现的; fooif 块之外不可用。

【讨论】:

所以我的 Chrome 实现了最新的规范,而我的 PhpStorm 落后了?我的 JS 语言级别设置为JSX Harmony @AndreKR:很有可能。我不熟悉 PhpStorm 或“JSX Harmony”,但鉴于 ES Harmony 是一个持续的过程,这似乎是可疑的 :-) 你还在使用 ES6 吗? 我没有使用它,但在调查此问题时我更改了语言级别。该错误也显示为语言级别设置为“ECMAScript 6”。

以上是关于严格模式是不是禁止语句级函数声明?的主要内容,如果未能解决你的问题,请参考以下文章

javascript的严格模式和正常模式

Javascript严格模式

ECMAScript 5 严格模式

ReactNative进阶(二十三):Javascript 严格模式详解

JavaScript严格模式

React Native:SyntaxError:严格模式不允许在词法嵌套语句中声明函数