Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过引用将JavaScript数组传递给局部变量?_Javascript_Oop - Fatal编程技术网

通过引用将JavaScript数组传递给局部变量?

通过引用将JavaScript数组传递给局部变量?,javascript,oop,Javascript,Oop,我在名称空间中有一个JavaScript数组,如下所示: app.collec.box = []; app.init = function () { var box = this.collec.box; // ... code to modify box }; this.collec.box = ...; 我在同一名称空间中有一个函数,如下所示: app.collec.box = []; app.init = function () { var box = thi

我在名称空间中有一个JavaScript数组,如下所示:

app.collec.box = [];
app.init = function () {
    var box = this.collec.box;
    // ... code to modify box
};
this.collec.box = ...;
我在同一名称空间中有一个函数,如下所示:

app.collec.box = [];
app.init = function () {
    var box = this.collec.box;
    // ... code to modify box
};
this.collec.box = ...;
我以为将局部变量设置为对象或对象属性只是对原始变量的引用,但似乎我错了,在更改函数中局部
box
变量的内容后,
app.collec.box
没有更改

请帮忙,我做错了什么?我怎样才能解决这个问题

提前谢谢

编辑。这是完整的代码

var app = {
    collec: {
        box: [],
        cache: []
    },

    init: function () {
        var box = this.collec.box;

        $.ajax({
            url: 'file.json',
            success: function (json) {
                // Map JSON array to box array using Underscore.js _()map
                box = _(json).map(function (o) {
                    return new Model(o);
                });
            }
        });
    }
};

app.init();

引用指向对象,而不是变量
box
不是对变量this.collec.box的引用;相反,
box
this.collec.box
是对内存中一个特定对象的引用。您可以通过这些变量中的任何一个修改此对象的属性,但不能使用一个变量修改另一个变量

如果要修改此.collec.box所指的内容,则需要直接如下设置:

app.collec.box = [];
app.init = function () {
    var box = this.collec.box;
    // ... code to modify box
};
this.collec.box = ...;
或者使用对
this.collec
对象的引用并修改其
属性:

var x = this.collec;
x.box = ...;

编辑:也许几张图表可以让你更容易理解发生了什么

当您分配
box=this.collec.box
时,实际情况如下:

this.collec.box -----> (object) <----- box
但这种情况不会发生。

您可以尝试使用

app.init = function (box) {
    // ... code to modify box
};

app.init(this.collec.box);

你所做的应该有用

我认为您的问题在于关键字this(尽管我不能肯定,除非看到更多的代码)。这可能是指函数(app.init)本身,而不是app

要排除故障,请尝试更改

var box=此.collec.box

。。。到

变量框=应用集合框

[编辑]

在看了更多的代码后,我的答案仍然是:用应用程序替换这个


您还应该将该行(var-box=app.collec.box;)放在回调函数中。我认为回调不会保留对box的引用,因为它是一个异步调用。

您可能正在以丢失app上下文的方式传递app.init。当您执行诸如div.onclick=app.init或setTimeout(app.init,1000)之类的操作时,当app.init最终被回调时,
将不会指向
app
,它将分别指向
div
窗口

如果需要将对象的方法指定为回调,请使用闭包。例如:

div.onclick=function(){app.init()}

只是一种预感:

您可以使用其中一个数组实例方法返回新的数组实例,而不是修改原始数组。您是否碰巧使用了
concat
join
slice
?这些是访问器,不是变异器

此外:

如果要修改
局部变量,请确保完成后将其重新赋值:

var box = this.collec.box;
// ... code to modify box
this.collec.box = box;

由于javascript是词汇范围的,
this
关键字将引用匿名函数,而不是实际的
app
关键字,就像@rick roth所说的那样。在匿名函数之外,您应该创建一个闭包,并具有如下内容:

var ns = this;
然后你就会这么做

ns.collec.box = [];
ns
可以是任何你想要的,但是在
app.init
中,你可以这样引用数组:

app.init = function () {
    var box = ns.collec.box;
    // ... code to modify box
};

因此,只要您的闭包设置正确,指向
ns
的任何内容都将被正确引用。

您在发送到
init
的参数中使用的
的值是多少?您已经从问题中排除了相关代码。@patrick确实如此@VerizonW请包含实际导致调用app.init的代码片段。您应该研究getter和setter:本文也可能会对您有所帮助:此答案包含错误信息。如果调用app.init的方式是
this
实际上指的是
app.init
(例如,只需调用
app.init()
@Jason:你在说什么?很明显,这个答案预期了
这个
指的是
应用程序
。OP没有展示他用
box
做了什么@Jason LeBrun:据我所知,OP试图在函数内部做
box=…
,并且问为什么这个变化没有反映在
这个函数中.collec.box
.No,
绝对不必引用app,这取决于调用
app.init
的上下文。数组变量确实是引用,
var anarray=someOtherArray
不创建
someOtherArray的副本,
它创建另一个变量,该变量将修改
someOtherA如果使用了rray,请在JS控制台中运行它,您将看到它是有效的:
var o={};o.box=[];o.init=function(){var l=this.box;l[0]='foo';};o.init();console.log(o.box[0])
@Jason:正如我所说,这个答案预期
这个
指的是
应用程序
。因此,这个答案中的信息是正确的。仅仅因为你假设
这个
不是指
应用程序
,并不意味着这个答案是错误的。问题中根本没有足够的信息来确定问题所在是的。在这种情况下,这不会有帮助,卡萨布兰卡的答案是OP需要的答案。谢谢,但将其更改为app.collec.box并不能解决问题。别担心。很高兴你找到了答案。