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 回答