0

JavaScript の関数が参照型 (単純な型とは異なり、参照によってコピーされる) である場合、ここで正確に何が起こっているのでしょうか?

var func = function() { alert(1); };
var func_alias = func;
var func = function() { alert(2); };
func_alias(); //1

func_aliasが への参照である場合func更新されないのはなぜですか? その呼び出し (4 行目) が返されると思いません2か?

これは、他の参照による例とは異なる動作です。

var obj = {prop: 'val'};
var obj_alias = obj;
obj.prop = 'updated val';
alert(obj_alias.prop); //updated val - not original one

func_alias元の上書き前のコピーを保持しているようですfunc-要するに、値によってコピーされたかのように動作するようです。もちろん、これは次のように反証されています。

var func = function(){}
var func_alias = func;
func === func_alias; //true
4

3 に答える 3

2

var func = function() { alert(1); };

ここで新しい関数が作成され、それへの参照がコピーされますfunc

var func_alias = func;

格納された関数参照はfunc別の変数に割り当てられますfunc_alias

var func = function() { alert(2); };

別の新しい関数が作成され、それへの参照が に割り当てられfuncます。に格納されている最初の関数への参照funcは失われます。func_aliasただし、上書きする前に保存したため、funcまだ呼び出すことができます。

func_alias();

func_alias手順 2 で最初の関数への参照が割り当てられました (その後は上書きされませんでした)。したがって、最初の関数が呼び出されます。


編集#1

オブジェクトを使用した2番目の例のように:

var obj = {prop: 'val'};

ここで、新しいオブジェクトが作成され、それへの参照が割り当てられますobj

var obj_alias = obj;

参照は別の変数 obj_alias にコピーされます

obj.prop = 'updated val';

ここでは、 の値を上書きするのではなくobj、obj に格納されている参照が指すオブジェクトのプロパティを上書きするだけです。の値obj(つまり、最初のステップで作成されたオブジェクトへの参照) はそのまま残ります。

関数の例では、実際には変数funcを新しい関数参照で上書きしていました。

alert(obj_alias.prop);

どちらも上書きしていないため、の値と の値はobj_alias同じままです。objどちらも、手順 1 で作成したオブジェクトへの参照を保持しています。


編集#2

これはC用語で説明できるかもしれません。

  • -経由でオブジェクトを作成する場合var obj = {prop: 'val'};、オブジェクトがメモリのアドレス 0x0001 に格納されているとします。つまり、obj の実際の値は 0x0001 です。

  • に割り当てるとobj_aliasobj_aliasも値 0x0001 を取得します。これで、両方の変数がアドレス 0x0001 に格納されたものを指します。

  • を行う場合obj.x = y、 の値を上書きするのではなく、objを使用objして 0x0001 に保存されているオブジェクトにアクセスし、そのプロパティの 1 つを変更するだけです。

于 2012-08-15T08:45:17.583 に答える
1

違いは

コードの最初の部分では、変数が別のオブジェクトを参照できるようにします。

コードの 2 番目の部分では、オブジェクトのプロパティを変更しました。2 つの変数は同じオブジェクトを参照しています。

var func = function() { alert(1); };
var func_alias = func; // func_alias refer to the first function.
var func = function() { alert(2); }; // let func refer to another function, but won't affect func_alias
func_alias(); //1
于 2012-08-15T08:33:58.750 に答える
0

プログラム コードを、オブジェクトの格納と使用を可能にする大規模な倉庫と見なす場合。
次に、コードは次のようになります:
行 1 - 関数を SOMEWHERE に保存すると、私 (最初の変数) がその場所を記憶します [ここで特定の場所を指定しない (そして指定することはできません)]。
2 行目 - 関数がどこに保存されているかを誰かに覚えてもらいます。
3 行目 - 別の関数をどこかに保存すると、私 (最初の変数) はそれがどこにあるかを記憶します [ここで特定の場所を指定しない (そして指定することはできません)]。
4 行目 - 2 行目の担当者に私の機能がどこにあるかを尋ねます。

期待される結果は何ですか?

于 2012-08-15T08:44:13.890 に答える