dポイントプレゼントキャンペーン実施中!

・リンク先で下記のように書かれているのですが、どうしてでしょうか?
>if文等のブロック内での関数宣言はしないでください。関数を使用する場合には、変数に関数を代入して定義するようにしてください。
http://www.hp-stylelink.com/news/2013/10/2013100 …

・スコープ範囲の影響?
・原文の英語サイトを見ると、ECMAScriptはブロック内で関数の宣言をサポート云々書いているのですが、どういう意味でしょうか?
http://google-styleguide.googlecode.com/svn/trun …

A 回答 (2件)

現在の大抵の実装では可能な記述ですが、ECMAScript の仕様ではないので避けるべき、だからです。

ECMAScript とは、各社でバラバラだった JavaScript の基本部分を整理した国際規格で、現在の JavaScript は全てこの規格に即しています。たぶん

ただ個人的には、以下の理由のほうがよっぽど重要です。

--

JavaScript の関数定義には、文と式の二通り有りますが、以下の違いがあります。

- 関数文は、コンパイル段階で「すべて」定義される
- 関数式は、式の実行段階で「のみ」定義される

この「すべて」というのは制御構文を無視して行われるので、制御構造に依存した関数文が意図通りに動作しないバグが生じる可能性が高まります。

function f(){return 0}
if (false) {
function f(){return 1} // 制御構造が無視され、既存の f が上書き
}
f(); // 0 ではなく 1 が返る

関数式ならこの問題はありません。

var f = function(){return 0}
if (false) {
f = function(){return 1} // 制御構造により、実行されず
}
f(); // 0 が返る
    • good
    • 0
この回答へのお礼

詳しい解説ありがとうございました。
大変勉強になりましたー

お礼日時:2013/10/16 12:45

標準仕様ではできないことで、動くのは独自拡張なので将来的に変更されるおそれがある


また、このような時に動作が予測しづらいです

function f1() {
if (true) {
var g = function (){ return 123 }
} else {
var g = function (){ return 456 }
}
return g()
}
f1() //123

function f2() {
if (true) {
function g() { return 123 }
} else {
function g() { return 456 }
}
return g()
}
f2() //456
    • good
    • 1
この回答へのお礼

回答&コード提示ありがとうございます。
大変参考になりましたー

お礼日時:2013/10/16 12:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!