看到我们有一个像这样的简单fn:
function run(foo, cb){
setTimeout(() => {
cb(null, {'val': foo, 'this': this});
}, 400);
}
我们希望重用该函数,可能使用异步库:
async.map({
foo: run.bind(null,'foo'),
bar: run.bind(null,'bar'),
baz: run.bind(null,'baz')
}, function(err){
});
我想做的是避免绑定"这个"函数中的值,并使其更简洁。
我们可以做的一件事是:
function run(foo){
return function(cb){
setTimeout(() => {
cb(null, {val: foo, this: this);
}, 400);
}
}
然后有这个:
async.map({
foo: run('foo'),
bar: run('bar'),
baz: run('baz')
}, function(err){
});
这更干净,但我认为使用绑定功能可以客观地生成更多通用代码,而不是使用后一种模式。
有没有人知道是否有本地方式调用绑定而不绑定"这个"一个函数的价值。或者也许是一种实现Function.prototype.bind()函数的方法,该函数不会绑定"这个"值?
这是我的尝试:
Function.prototype.customBind = function(){
var self = this;
var args1 = Array.from(arguments);
return function(){
var args2 = Array.from(arguments);
self.apply(this, args1.concat(args2));
}
};
通过这种方式,我们可以使用动态值来实现"这个"?我们会像这样使用这段代码:
async.map({
foo: run.bindCustom('foo'),
bar: run.bindCustom('bar'),
baz: run.bindCustom('baz')
}, function(err){
});