2

誰かにこれを説明してもらいたい:

function myFunction(array){
    array = $.grep(array, function(n,i){return n > 1 });
}

var mainArray = [1,2,3];

myFunction(mainArray);
document.write(mainArray) // 1,2,3, but i'm expecting 2,3

しかし、私が次のようなことをすると

    array[3] = 4;

行の代わりに$.grep、私は得る1,2,3,4. mainArrayによって作成された新しい配列になるべきではありません$.grepか?

4

2 に答える 2

5

いいえ、arrayパラメーターはローカル (参照) 変数でもあります。関数はこの変数に新しい配列を割り当てますが、呼び出し元の変数には影響しません。すべてのパラメーター (参照を含む) は、値によって渡されます。

の内容を変更 (ミューテーション) した場合はarray、次のようになります。

function myFunction(array){
    var grepResult = $.grep(array, function(n,i){return n > 1 });
    array.length = 0;
    Array.prototype.push.apply(array, grepResult);
}
于 2010-04-23T02:23:52.797 に答える
4

これは、JavaScript が実装する評価戦略によるものです。

関数はobject への参照のコピーを受け取ります。この参照コピーは仮パラメーターに関連付けられ、その値であり、関数内の引数に新しい値を割り当てても、関数外のオブジェクトには影響しません (元の参照)。

この種の評価戦略は多くの言語で使用されており、共有による呼び出しとして知られています。

于 2010-04-23T02:26:26.780 に答える