如何通过函数传递对对象的引用?

Posted

技术标签:

【中文标题】如何通过函数传递对对象的引用?【英文标题】:How do I pass a reference to an object via functions? 【发布时间】:2012-02-03 04:59:00 【问题描述】:

我想做:

mkArray(xml, "artist", "namespace.newarray");

function mkArray(xml, tag, store)
    store = [];
    $(xml).find(tag).each(function(i,v)
        store.push($(this).text());
    );
    console.log(store);

但这当然会覆盖 store 是什么,而不是将其用作对命名空间属性的引用。正确的做法是什么?我认为 window[store] 会工作,但没有任何运气。

【问题讨论】:

在这种情况下,我想说的正确方法是从mkArray返回数组并分配它; namespace.newarray = mkArray(xml, "artist") 【参考方案1】:

您可以创建一个对象,然后传递该对象。然后,修改对象的属性:

var reference = store: void 0;   // Or just ;
mkArray(xml, tag, reference);      // <-- Pass the "reference"
console.log(reference.store);      // <--- Yup.

function mkArray(xml, tag, o_store)
    o_store.store = [];
    $(xml).find(tag).each(function(i,v)
        store.push($(this).text());
    );
    // console.log(o_store.store);  // Look ahead

【讨论】:

我刚刚注意到稍微编辑的问题。我建议看看 Matts 的评论。如果您想更改您的功能,而不编辑其余调用,请使用:var storeProps = store.split('.'), store = window;for (var i=0; i&lt;storeProps.length; i++) store = store[storeProps[i]];。假设这些属性是全局定义的。【参考方案2】:

一般来说,最好避免使用有副作用的函数,例如改变他们的论点。如果你的函数应该创建一些东西,只需返回这个“东西”:

// good way

function mkArray(xml, tag) 
   var store = [];
   // populate store...
   return store;


myStore = mkArray(xml, tag);

如果由于某种原因这对您不起作用,您也可以修改函数参数,但对象本身应在调用代码中创建:

// worse, but possible 

function mkArray(xml, tag, store) 
   // populate store...


myStore = [];
mkArray(xml, tag, myStore);

【讨论】:

以上是关于如何通过函数传递对对象的引用?的主要内容,如果未能解决你的问题,请参考以下文章

java数组作为参数传入函数怎么让他不变化

传递由其他对象组成的对象数组作为对C++中函数的引用?

返回引用类型的返回引用的好处

如何将引用函数传递给另一个函数

通过引用内联函数传递 __m128i 对象会导致这些对象移动到堆栈吗?

通过引用函数传递向量,但更改不会持续