0

最近、JS で厄介な問題に遭遇しました。

オブジェクトの配列であるマップを関数 f に渡すとします。

var o=[{a:0}];
function f(a){
    for(var i in a){
        if (a.hasOwnProperty(i)){
            a[i]=null;
        }
    }
    return a;
};
var outp=f(o);

alert(outp[0]+" === "+o[0]+" : "+(outp[0]===o[0]));

// here we expect loose equality, and equality in type, 
//furthermore it should identically equal as well, and we got right!

しかし、関数パラダイムo=(function(o){return o})()のように、オブジェクトの全責任を引数として関数に渡すことはできません。これは、o へのいかなる種類の変更も参照されないためです!

var o=[];
function ff(a){
    return (a=undefined);
};
var outp=ff(o);
alert(outp+" === "+o.constructor+" : "+(outp===o));
// here we expect true, but we got false!

上記の参照損失と、2 番目のユース ケースでおそらく異なる参照処理が行われるのはなぜですか。ただし、どちらの場合も、関数は 0. の位置で配列引数を取得します。

4

1 に答える 1

1

Javascript は常に引数を値で渡すため、これは機能しません。

 function foo(x) {
    x = 100;
 }

 y = 5
 foo(y)
 y == 100 // nope

ただし、これは機能します。

 function foo(x) {
    x.bar = 100;
 }

 y = {}
 foo(y)
 y.bar == 100 // yes

2 番目のスニペットでも x は値で渡されますが、この値そのものがオブジェクトへの参照 (ポインター) です。そのため、関数内でそれを逆参照して、オブジェクトの「内部」にアクセスすることができます。

于 2013-04-08T14:33:39.670 に答える