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

时间:2017-04-19 01:23:04

标签: javascript typescript ecmascript-5 typescript2.2

我在TS中遇到此错误:

enter image description here

很清楚错误发生的原因:

function outer(){

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

       }
   }   
}

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

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

1 个答案:

答案 0 :(得分:3)

  

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

是。以下是要走的路:

<?php
//including the database connection file
include("config.php");

$result = mysqli_query($mysqli, "SELECT * FROM users ORDER BY id ASC"); 
// using mysqli_query instead


while($res = mysqli_fetch_array($result))
    {
?>
<table>
<tr>
    <td class="long"><?php echo $res['nameFirst'];?></td>
    <td class="long"><?php echo $res['nameLast'];?></td>
    <td class="long"><?php echo $res['email'];?></td>
    <td><a href="edit.php?id=$res[id]">Edit</a></td>
    <td><a href="delete.php?id=<?php echo $res['id']; ?>" onClick="return confirm('Are you sure you want to delete?')">Delete</a></td>
</tr>
<?php } ?>

</table>
  

为什么?

  • 默认情况下,ES模块处于严格模式。
  • 严格模式不允许块中的函数声明

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

  

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

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