【问题标题】:Why TS complains with function declarations inside function body为什么 TS 抱怨函数体内的函数声明
【发布时间】:2017-04-19 01:23:04
【问题描述】:

我从 TS 收到这个错误:

很清楚为什么会发生错误:

function outer(){

   if (true) {
        function inner(){    // nested function declaration

       }
   }   
}

但我的问题是 - 为什么 TS 抱怨这一点 - 是否有一些技术原因我应该在转换为 ES5 时避免嵌套函数声明?

函数表达式会是更好的选择吗?为什么?

【问题讨论】:

标签: javascript typescript ecmascript-5 typescript2.2


【解决方案1】:

函数表达式会是更好的选择吗

是的。以下是要走的路:

function outer() {
  if (true) {
    const inner = function() { // OK
    }
  }
}

为什么?

  • ES 模块默认处于严格模式。
  • 严格模式不允许在块中声明函数

original JavaScript specification 中介绍了它被禁止的原因。简短版本:实现之间的行为不一致

注意 众所周知,ECMAScript 的几个广泛使用的实现支持将 FunctionDeclaration 用作语句。然而,在应用于此类 FunctionDeclarations 的语义中,实现之间存在显着且不可调和的变化。由于这些不可调和的差异,将 FunctionDeclaration 用作 Statement 会导致代码在实现之间不能可靠地移植。建议 ECMAScript 实现要么禁止 FunctionDeclaration 的这种用法,要么在遇到这种用法时发出警告。 ECMAScript 的未来版本可能会为在 Statement 上下文中声明函数定义替代的可移植方式。

所以当严格模式出现时(ES5),它被禁止了。

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多