4

この例は「javascriptデザインパターン」にあり、次のコードの動作と混同されています

このコードは、自己定義関数を作成します。

var scareMe = function () {
   alert("Boo!");
   scareMe = function () {
     alert("Double boo!");
  };
};

今、それを別の変数に参照しています

var prank = scareMe; 

紛らわしいのは、いたずらを呼び出すと、scareMeが更新され、電話をかけ直すと、「ダブルブー」と警告する必要があるということです。

しかし、結果は

prank(); // "Boo!"
prank(); // "Boo!"

そして、scareMe関数をチェックすると、実際に再定義されています。

scareMe(); // Double boo!

いたずらは、なぜ違いがあるのか​​というよりも、scareMeへの単なる言及です。

4

3 に答える 3

6

prankはへの参照ではなくscareMe(これはjavascriptでは不可能です)、関数オブジェクトへの参照です。2つの変数は、独立して同じ関数を参照しています。

scareMeこの関数は、指しているものを明示的に上書きします。影響はありませんprank

これを見てください:

scareMe = function() {
    alert("Double boo!");
};

これには魔法はありません。最も近いscareMe変数が再割り当てされます。これはたまたまグローバル変数です。それ以外は何もしません。

于 2012-08-10T09:23:04.303 に答える
5

prankではなく、元の関数を指しscareMeます。

この例を見てください:

var scareMe = 1;
var prank = scareMe;

scareMe = 2;

scareMe変化が変わるとは思わないでしょうprank?関数についてもまったく同じです。

var scareMe = function() { alert( 'Boo' ); };
var prank = scareMe;

scareMe = function() { alert( 'Double boo!' ); };

この点で整数と関数の間に違いはありません—変更prankされても同じままscareMeです。別の関数の内部から変更されても、このscareMe事実は変更されません。

混乱は、オブジェクトが通常どのように使用されるかによって生じる可能性があります。オブジェクトのプロパティを変更する場合ほど、元の関数を変更することは一般的ではありません。

var scareMe = { message: 'Boo' };
var prank = scareMe;

scareMe.message = 'Double boo!';

alert( prank.message );  // alerts 'Double boo!'

これは、元の例の関数で行っていることではありません。完全に異なる関数を指すように変数を変更しても、他の変数の関数参照は変更されません。

于 2012-08-14T07:27:05.403 に答える
2

の結果はscareMe();、実行順序によって異なります。

scareMe();の前に呼び出すとprank();、アラートが表示Boo!され、に新しい関数が割り当てられるscareMeため、次にを呼び出すとscareMe();、アラートが表示されDouble boo!ます。

あなたの場合も同じです。を呼び出すとprank();、アラートが表示Boo!され、に新しい関数が割り当てられます。scareMeその後、を呼び出すとscareMe();、アラートが表示されDouble boo!ます。

于 2012-08-10T09:38:58.163 に答える