以下では、定義を使用して関数 f2 を直接呼び出すことも、個別に呼び出すことも試みます。両方の場合で呼び出されます。ただし、個別に呼び出す場合のみf2.str
初期化され、定義で直接呼び出される場合は初期化されません。誰か説明がありますか?
(function f2() {
alert("XXXXXXXXXXXXX");
f2.str = "EEEEEEEEEEEEEE";
}());
//f2();
以下では、定義を使用して関数 f2 を直接呼び出すことも、個別に呼び出すことも試みます。両方の場合で呼び出されます。ただし、個別に呼び出す場合のみf2.str
初期化され、定義で直接呼び出される場合は初期化されません。誰か説明がありますか?
(function f2() {
alert("XXXXXXXXXXXXX");
f2.str = "EEEEEEEEEEEEEE";
}());
//f2();
関数式を使用する場合、関数名はその関数にスコープされるため、バグのあるバージョンの 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