【问题标题】:function declarations cannot be inside an if statement according to ecmascript根据 ecmascript,函数声明不能​​在 if 语句中
【发布时间】:2021-11-09 01:31:34
【问题描述】:

怎么可能在 IfStatement 中声明一个函数?因为根据 ecmascript 规范,只有 Statement 可以在那里。

if ( 表达式 ) 语句

if ( 表达式 ) 语句 else 语句

FunctionDeclaration 不是声明,而是Declaration

所以也许我错过了一些东西,或者浏览器现在无法实现这样的东西,因为它可能会破坏在 if 语句中使用函数声明的网站。

【问题讨论】:

  • 规范的一般编写方式令人困惑。您的困惑来自哪里是可以理解的。请查看规范语法摘要中的list of Statements。在那里你会发现所有被认为是陈述的东西,所以它们更容易思考。在名为 Hoistable Declarations 的 Statement 类别下 - 事实上,您会发现 FunctionDeclaration 在声明的事物列表中。希望这会有所帮助。
  • @RandyCasburn A FunctionDeclaration 可能会列在规范的语句部分,但这并不意味着有一个产品可以使它成为 Statement i>.
  • @Bergi - 你可以对一个表达式说同样的话(并不意味着有一个产生式将一个表达式变成一个语句
  • @RandyCasburn 好吧,ExpressionStatement production 就是这样做的(没有分号)。函数声明没有这样的产生式。 FunctionDeclaration 不是 Statement
  • @RandyCasburn 但表达式是语句,因为语句可以是表达式语句,而表达式语句可以是表达式。

标签: javascript ecmascript-6 ecma262


【解决方案1】:

不可能将函数声明放在if 语句中。试试

if (true) function example() {}

在严格模式下 - 你会得到一个SyntaxError。要在条件分支中声明函数,您必须将其放在 Block 中,这是一个 Statement(通过 BlockStatement)并且可以包含 Declaration em>s(在 StatementList 中)。

也许现在浏览器无法实现这样的事情,因为它可能会破坏在 if 语句中使用函数声明的网站。

确实如此。对于 Web 旧版兼容性,function declarations in if statements are allowed in sloppy mode。不要写这样的代码,但允许浏览器将其视为有效。

【讨论】:

【解决方案2】:

来自规范:

在函数或脚本的顶层,内部函数声明被视为 var 声明。

链条是这样的。

Statement => BlockStatement => StatementList => StatementListItem => Declaration => VarDeclaration

没关系,声明列表项

https://tc39.es/ecma262/#prod-StatementListItem

在 ECMAScript 2015 之前,ECMAScript 规范没有将 FunctionDeclaration 的出现定义为 Block 语句的 StatementList 的元素。但是,对这种形式的 FunctionDeclaration 的支持是允许的扩展,并且大多数浏览器托管的 ECMAScript 实现都允许它们。

【讨论】:

  • 语句可以包含 var 声明
  • 是的,这是正确的变量语句。但是函数呢?
  • statements 包含 statementlist 并且 statementlist 包含 var 声明
  • 老兄,但我还没有谈到 Block 声明。 IfStatement 不必包含 BlockStatement 它可以包含其他类型的语句和函数声明不是其中之一,这就是我的全部困惑所在。
  • 看链接...
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多