2017-04-19 8 views
0

内の関数の宣言と文句を言う理由:TSは、私はTSからこのエラーを持つ関数本体

enter image description here

エラーが発生した理由はかなり明らかだ:

function outer(){ 

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

     } 
    } 
} 

を私の質問は - なぜTSはそれについて文句を言っています - ES5に移行するときにネストされた関数宣言を避けるべきいくつかの技術的な理由がありますか?

関数式を使用する方が良いでしょうか?なぜですか?

+2

可能な重複:http://stackoverflow.com/questions/10069204/function-declarations-inside-if-else-statements – SoEzPz

+0

便利なリンク:http://stackoverflow.com/questions/33359840/functions-トップレベル・イン・ストリクト・モードで宣言される – jevgenig

答えて

3

関数式は、より良い選択

はいだろう。次は移動するための方法である:

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

なぜ?

  • ESモジュールは、デフォルトでstrictモードになっています。
  • strictモードは、ブロック内の関数宣言それはoriginal JavaScript specificationに覆われて拒否された理由

理由を許可していません。短いバージョン:動作が実装間で矛盾しました

注記ECMAScriptの広く使用されている実装のいくつかは、FunctionDeclarationのステートメントとしての使用をサポートすることが知られています。しかし、そのようなFunctionDeclarationsに適用されるセマンティクスにおける実装間には、重大かつ相容れないバリエーションが存在する。これらの相容れない違いのため、FunctionDeclarationをStatementとして使用すると、実装間で確実に移植できないコードになります。 ECMAScriptの実装では、FunctionDeclarationのこの使用を禁止するか、そのような使用が発生したときに警告を発行することをお勧めします。 ECMAScriptの今後の版では、Statementコンテキストで関数を宣言するための代替の移植可能な手段を定義することができます。

厳格なモードが(ES5)になったとき、それは許可されませんでした。

関連する問題