如何使用参数数组调用Function.prototype.bind,而不是硬编码参数?(不使用ECMA6,因此没有传播运营商).
我试图在使用回调的模块周围放置一个promises包装器,我想绑定传递给我的包装器方法的所有参数并绑定它们.然后我想用我自己的回调调用部分应用的绑定函数,它将解析或拒绝一个promise.
var find = function() {
var deferred, bound;
deferred = Q.defer();
bound = db.find.bind(null, arguments);
bound(function(err, docs) {
if(err) {
deferred.fail(err);
} else {
deferred.resolve(docs);
}
});
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用,因为bind需要参数而不是参数数组.我知道我可以通过将我的回调插入到arguments数组的末尾并使用apply来做到这一点:
arguments[arguments.length] = function(err, docs) { ... }
db.find.apply(null, arguments);
Run Code Online (Sandbox Code Playgroud)
或者通过遍历arguments数组并为每个参数重新绑定函数:
var bound, context;
for(var i = 0; i < arguments.length; i++) {
context = bound ? bound : db.find;
bound = context.bind(null, arguments[i]);
}
bound(function(err, docs) { ... })
Run Code Online (Sandbox Code Playgroud)
但这两种方法都很脏.有任何想法吗?
javascript functional-programming partial-application promise
我有一个阵列
var arr = [' A ', ' b ', 'c'];
Run Code Online (Sandbox Code Playgroud)
而且我想 trim从数组中的每个元素的空格.
它可以通过使用Array.mapas 来完成
arr.map(function(el) {
return el.trim();
});
Run Code Online (Sandbox Code Playgroud)
我很好奇将trim/ toLowerCase函数直接传递给mapas回调函数,如arr.map(Math.max.apply.bind(Math.max,null)); 从每个子数组或arr.map(Number)获取最大元素; 将每个元素转换为Number.
我试过了
arr.map(String.prototype.trim.apply);
Run Code Online (Sandbox Code Playgroud)
但这是投掷错误
未捕获的TypeError:在undefined上调用了Function.prototype.apply,这是一个未定义的而不是函数
我希望String.prototype.trim.apply应该为数组中的每个元素调用,并将上下文设置为array中的元素(传递给apply);
mapmap当我读到这个答案时,找到var g = f.call.bind(f);.我第一眼看不到这一点.
那么它有一些直接意义,并有一些适当的使用场景吗?
当你在链接中使用call(or apply)或者bind同时使用时,会发生什么?有一些法律吗?