如何将参数添加到存储在稍后调用的数组中的方法

时间:2013-08-25 06:45:32

标签: javascript jquery

这是这个问题的后续行动(虽然这是自成一体的)trying to `call` three methods but not working correctly with jQuery map

我正在尝试在数组中存储一组方法,但是有一个可能具有如下参数的集合(初始方法在before_methods中,并且建议的方法在lm_methods中)。我确信这是我想要的非常自我解释,但我希望能够将参数合并到f的合理调用中(特别是arc.pLikedByTerm)。我目前有以下内容:

// signature
pLikedByTerm:function(term, ne, sw, m){
   ....  
}

// code before_methods just to show
this.before_methods=[arc.pLocations,arc.pLikedLocations,arc.pLikedItems];
this.lm_methods=[arc.pLocations,arc.pLikedLocations,arc.pLikedItems, arc.pLikedByTerm('surfing'),arc.pLikedByTerm('sailing')];
$.each(this.lm_methods, function(i,f){
  f(ne,sw,m);
});

我该怎么做或这是一个糟糕的设计?什么是惯用的方式?我的大脑被炒了。

事先提前

更新1

玩下面的答案,看起来这可能是最简单的事情:

var fns=[logStuff("this is msg"), logMoreArgs("a term","a you msg")];

for (var i=0; i<fns.length; i++) {
  fns[i];
}

2 个答案:

答案 0 :(得分:1)

具有一系列功能是经常使用的常见做法。例如,考虑一下这个Callback类。

function Callback(){
    this.callbacks = [];
}

Callback.prototype.run = function(cb) {
    for (var i=0; i<this.callbacks.length; i++) {
        this.callbacks[i]();
    }
};

然后我们可以添加一些回调。

function logStuff(msg) {
    jsprint(msg || "No message");
}

obj = new Callback();
obj.callbacks.push(logStuff);
obj.callbacks.push(logStuff);
obj.run();

如果我们run this我们发现它只记录我们的默认值。因此,如果我们想绑定一些数据,我们可以使用bind函数。

  

Function.prototype.bind

     

<强> thisArg
  要作为this参数传递给目标的值   调用绑定函数时的函数。如果,则忽略该值   绑定函数使用new运算符构造。

     

arg1,arg2,...
  支持前缀为绑定函数的参数的参数   在调用目标函数时。

我们的新代码将第一个参数设置为不同的字符串,然后我们会看到。您可以绑定任意数量的参数。

obj = new Callback();
obj.callbacks.push(logStuff.bind(null, "My message"));
obj.callbacks.push(logStuff.bind(null, "My other message"));
obj.run();

end result

答案 1 :(得分:0)

你正在做的事情会好起来的。只需删除参数和parens:

而不是:

  

this.lm_methods = [arc.pLocations,arc.pLikedLocations,arc.pLikedItems,   arc.pLikedByTerm( '冲浪'),arc.pLikedByTerm( '帆船')];

执行:

  

this.lm_methods = [arc.pLocations,arc.pLikedLocations,arc.pLikedItems,   arc.pLikedByTerm,arc.pLikedByTerm];

示例:

        function say(txt) {
            console.log("say" + txt);
        }
        function shout(txt) {
            console.log("shout" + txt);
        }
        function whisper(txt) {
            console.log("whisper" + txt);
        }

    var funcArr = [say, shout, whisper];

    $.each(funcArr, function(i, f) {
        f("hello");
    });

会打印:

的SayHello shouthello whisperhello