【问题标题】: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")

标签: javascript jquery arrays namespaces reference


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2017-09-11
    • 2020-08-11
    • 2019-06-05
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多