javascript - 变量被意外覆盖

标签 javascript variables module appcelerator commonjs

我在我的应用程序中观察到(对我来说)无法解释的行为。 我通过 require() 有一些包含。在其中一个名为“addUserFunction.js”的函数中,我有两个函数和一个包含对象的数组。
这是对象数组的定义:

exports.itemList = [{itemType:"info",itemName:"Information"},{...},{...}];

这是两个函数的定义:

exports.getItem = function(data) {
    var returnItem = {};
    for (var i=0;i<exports.itemList.length;i++) {
        if (exports.itemList[i].itemType == data.itemType){
            returnItem = exports.itemList[i]; // This line seems to pass a reference, not assign/copy
        }
    }
    returnItem.itemName = (data.itemName) ? data.itemName : returnItem.itemName;
    return returnItem;
}

exports.createPlan = function(formValues) {
    var returnItem = {
        id: 0,
        description: 'foobar',
        items: [
            exports.getItem({itemType:'info',itemName:'Information'}),
            exports.getItem({itemType:'somethingelse'}),
            exports.getItem({itemType:'bla',itemName:'yougottheidea'})
        ]
    };
    return returnItem;
}

现在的问题是:一旦我使用函数exports.getItem并覆盖一些属性,getItem似乎链接了新创建的 returnItem与原文itemList[i] 。所以下一个调用itemList[i]使用第一次调用的属性值。希望这个解释是可以理解的。 怎么会这样?

createPlan()从另一个 required() 调用像这样的文件:

var aF = require('addUserFunctions');
function addUser() {
    var formValues = {name: 'test'};
    formValues.foo = aF.createPlan(formValues);
}
module.exports = addUser;

最佳答案

每当您将变量或属性分配给对象(这包括所有类型的对象,甚至数组)时,分配的都是对象实例的引用值。也就是说,如果我有

a = {};
b = a;

然后是a.foo = 1,然后也是b.foo === 1。但是如果你这样做a = null;,b仍然指向它之前指向的同一个对象。您在代码中所做的就是挖掘数组,找到合适的条目,然后返回对该条目的引用。您想要做的是使用该引用作为创建新对象的模板。有多种方法可以创建这样的对象。最常见的方法是使用公共(public)库的 extend 方法之一。但是,如果您的对象深度超过一层,或者您的对象由除普通对象之外的其他内容组成,则事情可能会变得棘手,并且可能无法使用这些通用方法来创建对象的深拷贝,只能创建浅拷贝的。

最简单的方法是修改您的 getItem 以克隆您的模板,专门将您需要的属性复制到新对象中。如果模板中的任何属性引用了您可能需要副本的某个对象,请务必也复制该对象。

关于javascript - 变量被意外覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711936/

相关文章:

javascript - 多个复选框过滤 react 状态

我可以在宏中使用相同的变量名吗

powershell - 从另一个模块的函数创建时,来自隐式远程模块的命令不可用

javascript - 智能 : Jump to declaration in node modules when TypeScript community stubs are present?

javascript - jquery 在父 div 中选择类

iOS - 将变量分配给 cellForRowAtIndexPath 中对象的属性

javascript - 如何从延迟加载的模块访问 AppModule 模块导入?

javascript - Angular : How to create internal utils but do not export with module

javascript - Nodejs异步任务和匿名函数

c++ - 指针与引用