我希望能够将一堆不同变量的地址存储在数组中。这允许我通过名称访问变量,或者如果需要的话遍历它们。这在JS中可能吗?我可以在JavaScript中模拟C类指针数组吗?
(function(ns){
ns.obj = new function(){
var foo = "foo";
var bar = "bar";
//i really want this:
//var ary = [&foo, &bar];
var ary = [foo, bar];
this.print = function() {
console.log(foo);
console.log(bar);
}
this.setFoo = function(newFoo) {
//i really want this:
//*(ary[0]) = newFoo;
ary[0] = newFoo;
}
this.printAry = function() {
for(var i=0; i < ary.length; ++i) {
console.log(ary[i]);
}
}
};
}(window.ns = window.ns || {}));
ns.obj.print();
ns.obj.setFoo("newfoo!");
ns.obj.printAry();
ns.obj.print();
我看了看这个:
JavaScript array of pointers like in C++
但我希望能够在赋值的LHS使用ary
的元素,我不认为例子作品在这个情况下。
为什么在地球上我想这么做?
到目前为止,很多评论都有(正确)询问我为什么要这样做。我正在处理涉及异步对象初始化机制的专有API。基本上我创建了一个对象的实例,然后将它传递给此初始化器以便能够实际使用它。初始化程序包含一个onSuccess处理程序的字段,用于通知成功的初始化。我完全初始化的对象作为参数传递到这个成功处理程序,以便我可以获取对它的引用。
然后我可以自由地初始化我的下一个对象。它看起来有点像这样:
var a = new api.ApiObject();
var b = new api.ApiObject();
var c = new api.ApiObject();
var d = new api.ApiObject();
//omg this is ugly
api.initializeObject({
objToInit: a,
onSuccess: function(args) {
a = args.obj;
api.initializeObject({
objToInit: b,
onSuccess: function(args) {
b = args.obj;
api.initializeObject({
objToInit: c,
onSuccess: function(args) {
c = args.obj;
api.initializeObject({
objToInit: d,
onSuccess: function(args) {
d = args.obj;
}
});
}
});
}
});
}
});
a.doCoolStuff();
//and so on
这个深度嵌套的混乱只会愈演愈烈,因为我添加更多api.ApiObjects()
。那么我该如何解决这个问题?我不能改变的API,但也许一个递归函数可以帮助:
//maybe a recursive function could make this more concise?
function doInitialize(ary) {
api.initializeObject({
objToInit: ary[0];
onSuccess: function(args) {
//i'd like to assign this passed in reference to my local
//reference outside this function (var a, b, etc).
//An array of pointers would be useful here.
//how else can I get this assigned out, cuz this doesn't work...
ary[0] = args.obj;
if(ary.length > 1) {
ary.splice(0, 1);
doInitialize(ary);
}
}
}
}
doInitialize([a,b,c,d]);
//this won't work because I don't have a reference to the fully initialized object
a.doCoolStuff();
所以,也许更好的问题是:是否有一个既定的模式来处理异步成功链接这样吗?我想我已经看到其他公共JS框架(如dojo)使用这种onSuccess链接...我怎么做这不丑陋?
为什么?你试图解决什么更大的问题?当然,有可能的解决方法,比如存储一个你可以改变的对象数组,但是这很糟糕,并且可能有更好的方法来实现你的最终目标。许多高级语言不允许您直接使用指针,但在绝大多数情况下您并不需要。我把我的钱放在这是其中的一种情况。 – 2013-03-13 05:00:07
您当然无法访问任何实际的机器地址或获得性能改进。 – bchurchill 2013-03-13 05:02:18
默认情况下,所有变量都是JavaScript中的引用,使得您想要做的事情不在门外。如果它已经是一个参考,将它放入另一个容器不会加快速度。 – 2013-03-13 05:21:25