如何通过引用传递变量?

时间:2018-09-22 18:29:35

标签: javascript pass-by-reference

在其他编程语言中,我们使用&关键字通过引用传递变量。

例如,在php中

$a = 10;

function something(&$a){
    $a = 7;
};

something($a);

echo $a;
// 7

如何在javascript中做到这一点?

当用户单击向右或向左箭头时,我正在尝试获取下一个或上一个。图像按数组索引;

list: function (index) {
    let items = this.images;
    return {
        next: function () {
            if (index > items.length -1) {
                index = 0;
            }
            return items[index++];
        },
        prev: function () {
            if (index < 0) {
                index = items.length -1;
            }
            return items[index--];
        }
    }
}

在此迭代器之外,我需要使用索引变量。但是我只会得到旧的值...我想获得当前的索引。

1 个答案:

答案 0 :(得分:5)

JavaScript始终是按值传递的,JavaScript *中没有传递引用的概念。

您可以通过使用原子的原始版本来模仿效果:

let indexAtom = {value: 0};

function changeIndex(atom) {
  atom.value = 5;
}

changeIndex(indexAtom);

assert(indexAtom.value === 5);

我会说,如果您需要此功能,通常 有代码味,并且需要重新考虑您的方法。

对于您而言,应该使用闭包来达到相同的效果:

list: function (startingIndex = 0) {
    let items = this.images;
    let index = startingIndex; // note that index is defined here, inside of the function
    return {
        next: function () {
            // index taken from closure.
            if (index > items.length -1) {
                index = 0;
            }
            return items[index++];
        },
        prev: function () {
            // same index as the next() function
            if (index < 0) {
                index = items.length -1;
            }
            return items[index--];
        }
    }
}

* 一个常见的误解是对象是按引用传递的,这很混乱,因为对象的“值”也称为程序员和命名事物的“引用”。对象也是传递值,但是对象的值是一种特殊的“事物”,称为“引用”或“身份”。这样,多个变量就可以对同一对象保留相同的“引用”。