我在命名空间中有一个JavaScript数组,如下所示:
app.collec.box = [];
我在同一名称空间内有一个函数,如下所示:
app.init = function () {
var box = this.collec.box;
// ... code to modify box
};
我认为设置一个等于对象或对象属性的局部变量只是对原始属性的参考,但是在我的函数中更改了本地box
变量的内容之后,似乎我错了,{ {1}}不会改变。
请帮忙,我做错了什么?我怎么解决这个问题?
提前致谢。
编辑。这是完整的代码。
app.collec.box
答案 0 :(得分:6)
引用指向对象,而不是变量。 box
不是对变量this.collec.box
的引用;相反,box
和this.collec.box
是对内存中某个特定对象的引用。您可以通过这些变量之一修改此对象的属性,但不能使用一个变量来修改另一个变量。
如果您想修改this.collec.box
引用的内容,您需要直接设置它:
this.collec.box = ...;
或使用对this.collec
对象的引用并修改其box
属性:
var x = this.collec;
x.box = ...;
编辑:也许有几个图表可以让您更容易理解正在发生的事情。
当您指定box = this.collec.box
时,实际情况就是这样:
this.collec.box -----> (object) <----- box
两个变量都指向内存中的同一个对象,但box
实际上并未引用this.collec.box
变量。
如果发生这种情况,您期望的是什么:
box -----> this.collec.box -----> (object)
但这不会发生。
答案 1 :(得分:3)
你在做什么应该工作。
我认为您的问题在于关键字 this (尽管如果没有看到更多代码,我无法确定)。 这个可能指的是函数(app.init)本身,而不是 app 。
要排查尝试更改...
var box = this.collec.box;
...到......
var box = app.collec.box;
<强> [编辑] 强>
看到更多代码后,我的答案仍然存在:只需将此替换为 app 。
您还应该将该行(var box = app.collec.box;)放在回调函数中。我不认为回调会保持对box的引用,因为它是异步调用。
答案 2 :(得分:1)
由于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
的内容都将被正确引用。
答案 3 :(得分:0)
您可以尝试使用
app.init = function (box) {
// ... code to modify box
};
app.init(this.collec.box);
答案 4 :(得分:0)
你可能正在传递app.init,导致app的上下文丢失。当您执行div.onclick = app.init或setTimeout(app.init,1000)之类的操作时,当app.init最终被回调时,this
将不指向{{ 1}},它将分别指向app
或div
。
如果需要将对象的方法指定为回调,请使用闭包。例如:
window
答案 5 :(得分:0)
只是预感:
您可能正在使用其中一个返回新数组实例的Array实例方法,而不是修改原始数组。您是否有机会使用concat
,join
或slice
?这些是访问者,而不是变异者。
此外:
如果您要修改box
本地变量,请确保在完成后将其分配回来:
var box = this.collec.box;
// ... code to modify box
this.collec.box = box;