・リンク先で下記のように書かれているのですが、どうしてでしょうか?
>if文等のブロック内での関数宣言はしないでください。関数を使用する場合には、変数に関数を代入して定義するようにしてください。
http://www.hp-stylelink.com/news/2013/10/2013100 …
・スコープ範囲の影響?
・原文の英語サイトを見ると、ECMAScriptはブロック内で関数の宣言をサポート云々書いているのですが、どういう意味でしょうか?
http://google-styleguide.googlecode.com/svn/trun …
No.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 が返る
No.1
- 回答日時:
標準仕様ではできないことで、動くのは独自拡張なので将来的に変更されるおそれがある
また、このような時に動作が予測しづらいです
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Excel(エクセル) OFFSET関数を使用した印刷範囲の自動変更について 2 2022/06/02 12:11
- JavaScript 条件に該当した時のみ定数を宣言する事はできますか 8 2023/03/15 05:55
- 教えて!goo ブロック宣言(マジレス希望) 1 2023/01/23 01:08
- Excel(エクセル) Excel マクロで For 文のインデックスを先に宣言する理由 7 2022/08/27 00:26
- 工学 制御工学の問題について 1 2022/10/22 17:44
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Visual Basic(VBA) VBA エクセル 条件の設定 1 2022/03/28 10:24
- その他(教育・科学・学問) エクセル関数について 2 2022/12/23 08:59
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
クリックすると上に開くアコー...
-
getElementByIdを使用したグロ...
-
要素名がスペースを含む場合のj...
-
idを使わずにonclickで自身の要...
-
jslintのエラーについて質問
-
setTimeoutで、止まらない
-
無名関数を使うメリットは何で...
-
pythonでのクロージャの記述
-
jqueryの変数を関数の外に出す方法
-
コードをスマートにさせたい。
-
ajax反映後のjqueryが動かない
-
google apps scriptの終了のさせ方
-
翌月を取得するGASが分かりません
-
GASでundefinedエラーが出ます
-
日付の書式の確認方法
-
Linux バイナリ実行できない "...
-
ジェネレーターの作り方
-
ActiveXobjectが作成できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
phpでの文字の点滅表示
-
JAVAスクリプトで指定時間以降...
-
jslintのエラーについて質問
-
ページ内に複数表がある場合のT...
-
XMLHttpRequestでキャッシュを...
-
関数名をテキストから読み込む...
-
jQueryでzipを解凍読み込みする...
-
getElementByIdを使用したグロ...
-
jQuery 同じ処理を関数にまとめ...
-
クリックすると上に開くアコー...
-
小数点以下を5刻みで表示
-
Javascriptで引数の参照渡しか...
-
jQueryの"return false"の役割...
-
javascript(jQuery)でセル内...
-
jQueryの :not() .not() が有効...
-
jqueryの変数を関数の外に出す方法
-
jquery 複数のメソッド
おすすめ情報