代码之家  ›  专栏  ›  技术社区  ›  Jason

使用byref传递的数组

  •  2
  • Jason  · 技术社区  · 14 年前

    我想找个人给我解释一下:

    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 成为由创建的新数组 格雷普 ?

    2 回复  |  直到 10 年前
        1
  •  5
  •   Matthew Flaschen    14 年前

    不, array 参数也是一个局部(引用)变量。函数为该变量分配一个新数组,但这不会影响调用方的变量。所有参数(包括引用)都按值传递。

    如果你修改了 数组 ,那就不同了:

    function myFunction(array){
        var grepResult = $.grep(array, function(n,i){return n > 1 });
        array.length = 0;
        Array.prototype.push.apply(array, grepResult);
    }
    
        2
  •  4
  •   Christian C. Salvadó    14 年前

    到期日是 evaluation stretegy javascript实现的。

    您的函数接收 对象引用的副本 ,此引用副本与形式参数关联,并且是其值,并且将新值分配给函数内部的参数不会影响函数外部的对象(原始引用)。

    这种评估策略被许多语言使用,被称为 call by sharing