javascript 闭包不适用于数组属性?

标签 javascript closures

 var a = [false, 3];
 console.info('a: '+a);
     (function(item){
            var jamie = item;
        jamie [1]--;
         console.info('jamie:  '+jamie);
     })(a);
 console.info('a: '+a);

在我看来,a[1] 在此 javascript 中应始终等于 3。

当不使用数组时,它按预期工作:

 var a = 3;
 console.info('b: '+a);
     (function(item){
            var jamie = item;
        jamie--;
         console.info('jamie b:  '+jamie);
     })(a);

console.info('b: '+a);

为什么我运行这个 JS 后 a[1] 输出 2Fiddle of said problem :O

最佳答案

因为您提供的是对对象的引用,而不是按值传递它;

如果你想克隆对象,这里有一个有用的函数来允许它:

function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

var a = [false, 3];
console.info(a); // [false, 3];
    (function(item){
        var jamie = clone(item);
        jamie [1]--;
        console.log(jamie); // [false, 2];
    })(a);
console.info(a); // [false, 3];

关于javascript 闭包不适用于数组属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23793798/

相关文章:

python - 关于 python 闭包

javascript - 使变量的行为类似于全局变量

jquery - 使用 jquery .each() 函数时,在回调中使用 Element 参数的目的是什么?

JavaScript 实时验证 : onchange triggered only the first time

javascript - 如何通过 YouTube Player IFrame API 区分 "seek"和 "pause"

javascript - Nodeunit 测试基于事件的异步代码

javascript - Mongoose 找不到所需的输出

objective-c - 将 Reactive Cocoa doNext^ 转换为 Swift

javascript - 如何从浏览器控制台访问存储在函数闭包中的javascript变量?

javascript - 如何根据它是 Node.JS 中的 $regex 还是 $text 对 Mongoose 结果进行排序?