2

我从 TS 收到此错误:

在此处输入图像描述

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

function outer(){

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

       }
   }   
}

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

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

4

1 回答 1

7

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

是的。以下是要走的路:

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

为什么?

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

它被禁止的原因包含在原始 JavaScript 规范中。简短版本:实现之间的行为不一致

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

因此,当严格模式出现(ES5)时,它就被禁止了。

于 2017-04-19T05:28:19.223 回答