Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么TS抱怨函数体中的函数声明_Javascript_Typescript_Ecmascript 5_Typescript2.2 - Fatal编程技术网

Javascript 为什么TS抱怨函数体中的函数声明

Javascript 为什么TS抱怨函数体中的函数声明,javascript,typescript,ecmascript-5,typescript2.2,Javascript,Typescript,Ecmascript 5,Typescript2.2,我从TS中发现此错误: 发生错误的原因非常清楚: function outer(){ if (true) { function inner(){ // nested function declaration } } } 但我的问题是——为什么TS会抱怨这一点——在传输到ES5时,是否有一些技术原因使我应该避免嵌套函数声明 函数表达式是更好的选择吗?为什么 函数表达式是更好的选择吗 对。下面是要走的路: function outer()

我从TS中发现此错误:

发生错误的原因非常清楚:

function outer(){

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

       }
   }   
}
但我的问题是——为什么TS会抱怨这一点——在传输到ES5时,是否有一些技术原因使我应该避免嵌套函数声明

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

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

对。下面是要走的路:

function outer() {
  if (true) {
    const inner = function() { // OK
    }
  }
}
为什么?

  • 默认情况下,ES模块处于严格模式
  • 严格模式不允许在块中声明函数
不允许的原因已在本手册中说明。简短版本:实现之间的行为不一致

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

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

可能的重复:这里还有一些有用的链接: