如何在JavaScript中通过引用传递变量?

我有三个变量,我想对它们执行一些操作,所以我想把它们放在一个for循环中,并对每个变量执行操作。

伪代码:

myArray = new Array(var1, var2, var3);
for (var x = 0; x < myArray.length; x++){
    // Do stuff to the array
    makePretty(myArray[x]);
}
// Now do stuff to the updated variables

最好的方法是什么?


当前回答

像字符串和数字这样的基本类型变量总是按值传递。 数组和对象通过引用或基于以下条件的值传递:

如果你正在设置一个对象或数组的值,它是通过值传递。 Object1 = {prop: "car"}; Array1 = [1,2,3]; 如果你正在改变一个对象或数组的属性值,那么它是引用传递。 中的object1。道具= "汽车"; Array1 [0] = 9;

Code

函数passVar(obj1, obj2, num) { 其中obj1。道具= "笔记本电脑";//将改变原来的 Obj2 ={道具:"电脑"};//不影响原 Num = Num + 1;//不影响原 } Var object1 = { 道具:“车” }; Var object2 = { 道具:“自行车” }; Var number1 = 10; passVar(object1, object2, number1); console.log(中的object1);//输出:对象{道具:"笔记本电脑"} console.log (object2);//输出:Object {prop: "bike"} console.log (number1);//输出:10

其他回答

我喜欢在JavaScript中解决引用的不足,就像这个例子所显示的那样。

这样做的本质是,您不必尝试创建一个通过引用。相反,您可以使用返回功能,并使其能够返回多个值。因此,不需要在数组或对象中插入值。

var x = "First"; var y = "Second"; var z = "Third"; log('Before call:',x,y,z); with (myFunc(x, y, z)) {x = a; y = b; z = c;} // <-- Way to call it log('After call :',x,y,z); function myFunc(a, b, c) { a = "Changed first parameter"; b = "Changed second parameter"; c = "Changed third parameter"; return {a:a, b:b, c:c}; // <-- Return multiple values } function log(txt,p1,p2,p3) { document.getElementById('msg').innerHTML += txt + '<br>' + p1 + '<br>' + p2 + '<br>' + p3 + '<br><br>' } <div id='msg'></div>

另一种通过引用传递任何(局部的,基本的)变量的方法是通过eval“动态”地用闭包包装变量。这也适用于“use strict”。(注意:注意eval对JavaScript优化器不友好,并且变量名周围缺少引号可能会导致不可预测的结果)

"use strict"

// Return text that will reference variable by name (by capturing that variable to closure)
function byRef(varName){
    return "({get value(){return "+varName+";}, set value(v){"+varName+"=v;}})";
}

// Demo

// Assign argument by reference
function modifyArgument(argRef, multiplier){
    argRef.value = argRef.value * multiplier;
}

(function(){
    var x = 10;

    alert("x before: " + x);
    modifyArgument(eval(byRef("x")), 42);
    alert("x after: " + x);
})()

现场示例:https://jsfiddle.net/t3k4403w/

通过引用传递变量的变通方法:

var a = 1;
inc = function(variableName) {
  window[variableName] += 1;
};

inc('a');

alert(a); // 2

是的,实际上你可以在不访问全局变量的情况下完成:

inc = (function () {
    var variableName = 0;

    var init = function () {
        variableName += 1;
        alert(variableName);
    }

    return init;
})();

inc();

我个人不喜欢各种编程语言提供的“引用传递”功能。也许这是因为我刚刚发现函数式编程的概念,但是当我看到函数会产生副作用(比如通过引用来操纵参数)时,我总是起鸡皮疙瘩。我个人强烈拥护“单一责任”原则。

恕我直言,函数应该使用return关键字只返回一个结果/值。我不修改参数/实参,而是返回修改后的参数/实参值,并将任何所需的重赋留给调用代码。

但有时(希望很少),需要从同一个函数返回两个或多个结果值。在这种情况下,我会选择将所有这些结果值包含在单个结构或对象中。同样,处理任何重分配都应该由调用代码来决定。

例子:

假设通过在参数列表中使用'ref'这样的特殊关键字来支持传递参数。我的代码可能是这样的:

//The Function
function doSomething(ref value) {
    value = "Bar";
}

//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar

相反,我更喜欢这样做:

//The Function
function doSomething(value) {
    value = "Bar";
    return value;
}

//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar

当我需要编写一个返回多个值的函数时,我也不会使用引用传递的参数。所以我会避免这样的代码:

//The Function
function doSomething(ref value) {
    value = "Bar";

    //Do other work
    var otherValue = "Something else";

    return otherValue;
}

//The Calling Code
var value = "Foo";
var otherValue = doSomething(value);
console.log(value); //Bar
console.log(otherValue); //Something else

相反,我实际上更喜欢在对象中返回两个新值,就像这样:

//The Function
function doSomething(value) {
    value = "Bar";

    //Do more work
    var otherValue = "Something else";

    return {
        value: value,
        otherValue: otherValue
    };
}

//The Calling Code:
var value = "Foo";
var result = doSomething(value);
value = result.value; //Reassignment
console.log(value); //Bar
console.log(result.otherValue);

这些代码示例非常简化,但它大致演示了我个人如何处理这些东西。它帮助我把各种责任放在正确的位置。

快乐的编码。:)

我完全明白你的意思。同样的事情在Swift中是没有问题的。底线是使用let,而不是var。

原语是按值传递的,但在迭代时var i的值没有复制到匿名函数中,这一点至少令人惊讶。

for (let i = 0; i < boxArray.length; i++) {
  boxArray[i].onclick = function() { console.log(i) }; // Correctly prints the index
}