我正在创建一个函数,该函数已经给出了两个参数。我想绑定一个也会被传入的变量。
this.listenTo(this.topView,this.directionChosen.bind('top');
this.listenTo(this.leftView,this.directionChosen.bind('left');
this.listenTo(this.rightView,this.directionChosen.bind('right');
this.listenTo(this.bottomView,this.directionChosen.bind('bottom');
directionChosen:function(item,move,direction) {
}
是否可以绑定变量/属性并将其作为函数的方向传递?
我一直在这样做,但可能做得不好。谢谢
如果您查看的文档.bind()
,则可以看到它带有一个或多个参数。第一个参数是this
要为函数调用设置的指针。您必须将其作为第一个参数传递。之后的其他参数是可选的,并且将是传递给实际函数的第一个参数。
进一步(我不太清楚您要问的是什么),您必须传递要传递的实际参数,而不是变量名。
因此,您的操作方式将行不通。您必须将所需的this
值作为第一个参数传递,并且您传递的所有其他参数将首先发送到函数,而不是最后发送给函数。
您可以使用闭包来解决您的问题,本质上是一样的.bind()
,但是在您自己的自定义闭包中,您可以使用函数参数做任何您想做的事情。
// method to call
directionChosen: function(item,move,direction) {
}
// code to call our method with custom arguments
var self = this;
this.listenTo(this.mainView, function(item, move) {
self.directionChosen(item, move, 'top');
});
或者,如果top
实际上是一个变量名,并且您希望将该变量的值作为参数传递(从您的问题中不清楚,您想要的是什么),它将看起来像这样:
// code to call our method with custom arguments
var self = this;
this.listenTo(this.mainView, function(item, move) {
self.directionChosen(item, move, top);
});
如果要大量使用此后挂起的参数行为,则可以创建自己的自定义版本.bind()
来为您执行此操作。
Function.prototype.bindAfter = function(thisPtr /* one or more args */) {
var args = Array.prototype.slice.call(arguments);
var self = this;
args.shift();
return function() {
var newArgs = Array.prototype.slice.call(arguments).concat(args);
return self.apply(thisPtr, newArgs);
}
};
然后可以这样使用.bindAfter()
:
this.listenTo(this.topView,this.directionChosen.bindAfter(this, 'top'));
this.listenTo(this.leftView,this.directionChosen.bindAfter(this, 'left'));
this.listenTo(this.rightView,this.directionChosen.bindAfter(this, 'right'));
this.listenTo(this.bottomView,this.directionChosen.bindAfter(this, 'bottom'));
仅供参考,解决此问题的暴力方式如下:
var self = this;
this.listenTo(this.topView, function(item, move) {
return self.directionChosen(item, move, 'top');
});
this.listenTo(this.leftView, function(item, move) {
return self.directionChosen(item, move, 'left');
});
this.listenTo(this.rightView, function(item, move) {
return self.directionChosen(item, move, 'right');
});
this.listenTo(this.bottomView, function(item, move) {
return self.directionChosen(item, move, 'bottom');
});
实际上创建的新代码更少.bindAfter()
。
您还可以创建一个针对此问题的辅助函数:
function callWithDirection(thisPtr, direction) {
return function(item, move) {
return thisPtr.directionChosen(item, move, direction)
}
}
然后,您可以像这样使用它:
this.listenTo(this.topView, callWithDirection(this, 'top'));
this.listenTo(this.leftView, callWithDirection(this, 'left'));
this.listenTo(this.rightView, callWithDirection(this, 'right'));
this.listenTo(this.bottomView, callWithDirection(this, 'bottom'));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句