JavaScript动作函数作为参数

时间:2014-09-19 08:17:03

标签: javascript override function-parameter

我创建了一个循环遍历对象成员的函数,并将它们的数组作为一个单独的函数用作util。在这个函数中我想使用一个参数;我们称之为 action ,这是对循环对象成员数组中另一个操作字符串的函数的引用。 例如,我使用String.prototype.functionThatDoesSomething覆盖String,所以我可以在循环中使用它:arrayOfStrings [i] .functionThatDoesSomething()。

我如何将这样的函数作为参数传递给util函数?

这样的事情就是我所追求的:

objLoop(myObj, String.prototype.functionThatDoesSomething); 

function objLoop(obj, action) {
    var modData = {};
    var list = [];
    for (var key in obj) {
        list = obj[key];
        var i,
            n = list.length;
        for (i=0; i<n; i+=1) {
            list[i] = list[i].action(); // e.g. functionThatDoesSomething()
        }
        modData[key] = list;
    }
    return modData;
}

3 个答案:

答案 0 :(得分:1)

使用包装函数接受和使用回调参数的“标准”方法;

objLoop(myObject, function (str) { return str.toLowerCaser(); });

然后将其用作

list[i] = action(list[i]);

可能有效的替代方法(在此示例中有效)是通过call/apply指定上下文;

objLoop(myObject, String.prototype.tolowerCase); 

然后将其用作

list[i] = action.call(list[i])

这要求提供的函数适用于上下文,但它允许使用原始调用样式。 (像jQuery这样的库经常使用指定上下文和其他参数的组合。)


最后一种方法是提供字符串作为属性名称,以解析为要调用的相应函数。例如,这样称呼;

objLoop(myObject, "toLowerCase"); 

然后将其用作

// note calling the parameter methodName vs action for distinction
list[i] = list[i][methodName]();

这是所示三种方法中灵活性最低(也是最不惯用)的方法,尽管在某些情况下可能有用。

答案 1 :(得分:0)

您需要传递原型成员的名称:

function myCustomUpper() {
  return this.toUpperCase();
}

String.prototype.up = myCustomUpper;

var action = 'up';
'hello'[action]();

答案 2 :(得分:0)

考虑使用Object.keys迭代数组。

你最终可能会遇到这样的事情:

&#13;
&#13;
// return a new object that contains the same keys as object o
// but had function f called on each value
function myMap(o, f) {
    var new_o = {};
    Object.keys(o).forEach(function(k){
        new_o[k] = f.apply(o[k]);
    });
    return new_o;
}
&#13;
&#13;
&#13;

&#13;
&#13;
// E.g. call String.toUpperCase on an anonymous object containing two fields
myMap({ s1: 'string 1', s2: 'string 2' }, "".toUpperCase);
&#13;
&#13;
&#13;