TS为什么在函数体内抱怨函数声明

Ale*_*lls 1 javascript ecmascript-5 typescript typescript2.2

我从TS中收到此错误:

在此处输入图片说明

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

function outer(){

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

       }
   }   
}
Run Code Online (Sandbox Code Playgroud)

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

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

bas*_*rat 5

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

是。以下是方法:

function outer() {
  if (true) {
    const inner = function() { // OK
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么?

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

原始JavaScript规范中涵盖了不允许使用此功能的原因。简短版:行为在实现之间不一致

注意已知有几种广泛使用的ECMAScript实现支持使用FunctionDeclaration作为语句。但是,在实现于此类FunctionDeclaration的语义上,实现之间存在重大且不可调和的变化。由于存在这些无法协调的差异,因此将FunctionDeclaration作为Statement的使用会导致代码无法在实现之间可靠地移植。建议ECMAScript实现禁止使用FunctionDeclaration,或者在遇到这种情况时发出警告。ECMAScript的未来版本可能会定义其他可移植方式,以在Statement上下文中声明函数。

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