我创建了一个循环遍历对象成员的函数,并将它们的数组作为一个单独的函数用作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;
}
答案 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迭代数组。
你最终可能会遇到这样的事情:
// 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;
// E.g. call String.toUpperCase on an anonymous object containing two fields
myMap({ s1: 'string 1', s2: 'string 2' }, "".toUpperCase);
&#13;