通过引用将JavaScript数组传递给局部变量?
我在名称空间中有一个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
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并不能解决问题。别担心。很高兴你找到了答案。