JavaScript 関数では、ネストされた関数を関数式として定義する必要がありますか、それとも関数本体で関数宣言を使用できますか? たとえば、このようなものは準拠していますか?
function a() {
function b() {
function c() {
window.alert(3);
}
window.alert(2);
}
window.alert(1);
}
それとも、このようなことをしなければなりませんか?
function a() {
var a = function () {
var c = function () {
window.alert(3);
}
window.alert(2);
}
window.alert(1);
}
ECMA-262 は次のように述べています。
広く使用されている ECMAScript の実装のいくつかは、Statement としての FunctionDeclaration の使用をサポートすることが知られています。ただし、そのような FunctionDeclarations に適用されるセマンティクスの実装には、重大で相容れないバリエーションがあります。これらの相容れない違いのため、FunctionDeclaration を Statement として使用すると、実装間で確実に移植できないコードが生成されます。ECMAScript の実装では、この FunctionDeclaration の使用を禁止するか、そのような使用が発生した場合に警告を発行することをお勧めします。ECMAScript の将来の版では、Statement コンテキストで関数を宣言するための代替の移植可能な手段が定義される可能性があります。
これは、関数本体の関数宣言が技術的に正しくないということですか、それとも完全に間違っているのでしょうか? 人々がボディをブロックと呼んでいると聞いたことがありますが、これは標準によれば 1 つまたは複数のステートメントですが、よくわかりません。