同じように、コードから始めます:
<スクリプト>
var f = function g() {
return 1;
if (false) {
f = function g(){
return 2 ;
};
}
alert(g()); // 2
このコードを IE 6 に入力すると、次のようになります。 Chrome とはまったく異なります。
ここでの出力 2 は ie6 での効果です。Chrome の場合、g が定義されていないように見えます。
これは JScript のバグと考えられます。
ここにあるのは g を定義する関数式にすぎないことは明らかです。 if 条件文には関数式のみが定義されており、関数は宣言されていません。
それでは、そのような直接アクセスは間違いなく間違っています。
では、ステートメントとは何で、関数式とは何でしょうか?
ECMAScript では、関数を作成する 2 つの最も一般的な方法は、関数式と関数宣言です。ECMA 仕様では、関数宣言には ( を付ける必要がある) という 1 つの点だけが明確にされているため、この 2 つの違いは少しわかりにくいです。
関数宣言:
関数 関数名 (パラメーター: オプション) {関数本体}
関数式:
Function 関数名 (オプション) (パラメータ: オプション) {関数本体}
したがって、関数名が宣言されていない場合は式でなければならないことがわかりますが、If関数名が宣言されていますが、それが関数宣言なのか関数式なのかを判断するにはどうすればよいですか? ECMAScript はコンテキストによって区別されます。関数 foo(){} が代入式の一部である場合、関数 foo(){} が関数本体内に含まれている場合、またはプログラムの先頭にある場合、それは関数式です。関数宣言。
括弧で囲まれた関数式 (function foo(){}) というあまり一般的ではない関数式もあります。これが式である理由は、括弧 () がグループ化演算子であるためです。内部には式のみを含めることができます。
eval を使用して JSON を実行する場合、通常、JSON 文字列は eval('(' json ')') のように括弧で囲まれていると思われるかもしれません。その理由は、グループ化演算子であるためです。この括弧のペアにより、パーサーは JSON 中括弧をコード ブロックではなく式に解析するように強制されます。