1

以下では、定義を使用して関数 f2 を直接呼び出すことも、個別に呼び出すことも試みます。両方の場合で呼び出されます。ただし、個別に呼び出す場合のみf2.str初期化され、定義で直接呼び出される場合は初期化されません。誰か説明がありますか?

(function f2() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

}());

//f2();
4

1 に答える 1

2

関数式を使用する場合、関数名はその関数にスコープされるため、バグのあるバージョンの IE を除いて、関数の外では定義されません。Javascript で関数を定義するさまざまな方法の違いについて詳しくは、こちらをご覧ください。

関数名と関数が割り当てられる変数には違いがあります。

  • 関数名は変更できませんが、関数が割り当てられている変数は再割り当てできます。
  • 関数名は、関数の本体内でのみ使用できます。関数の本体の外側で使用しようとすると、エラーが発生します (関数名が以前に var ステートメントで宣言されていた場合は undefined になります)。例えば:

    var y = 関数 x(){};
    アラート (x); // エラーをスローします

    関数名は、Function の toString メソッドを介して関数がシリアル化されるときにも表示されます。

    一方、関数が割り当てられる変数は、関数が宣言されているスコープを含むことが保証されているスコープによってのみ制限されます。

  • 4 番目の例が示すように、関数名は、関数が割り当てられている変数とは異なる場合があります。それらは互いに関係がありません。

例:

(function f2() {

    // f2 is defined here

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

    // f2.str is defined here

}());

// In buggy versions of IE f2 and f2.str are still defined. 
// In all other browsers they are correctly not defined.



関数式を使用し、それ自体のスコープ外に存在させたいf2場合は、次のいずれかを実行できます。

var f2 = function() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

};

f2();

または:

var f2; // Declare f2 in this scope
(f2 = function() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

})(); // <-- Note that the parenthesis have been necessarily reordered
于 2013-06-19T19:09:25.397 に答える