相关疑难解决方法(0)

使用带有参数数组的Function.prototype.bind?

如何使用参数数组调用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

47
推荐指数
3
解决办法
1万
查看次数

如何将原型上定义的方法传递给Array.map作为回调

我有一个阵列

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);

我也尝试不同的组合apply,callbind没有成功.

  1. 为什么使用时无法引用原型上的函数map
  2. 函数如何作为参数传递给map

javascript arrays prototype

7
推荐指数
1
解决办法
945
查看次数

在JavaScript中链接'绑定'和'调用'?

当我读到这个答案时,找到var g = f.call.bind(f);.我第一眼看不到这一点.

那么它有一些直接意义,并有一些适当的使用场景吗?

当你在链接中使用call(or apply)或者bind同时使用时,会发生什么?有一些法律吗?

javascript chaining

6
推荐指数
1
解决办法
1023
查看次数