今天,在使用下划线和主干编写代码时,我不得不包装一些功能。 我在underscorejs.org上看到了以下示例
var hello = function(name){返回“ hello:” +名称; };
你好= _.wrap(你好,函数(func){
返回“ before,” + func(“ moe”)+“,after”;
});
你好();
=>'之前,你好:萌,之后'
在倒数第二行
如果函数调用就像
你好(“ umar”);
我的意思是说争论来自外部。
Wrap已经为您解决了大部分此类问题。 包装的源很短,无法通读。 您可以在下面的扩展示例中进行操作:
var greet = function(name, language){
var response
if (language === "sp") {
response = "Hola"
} else if (language === "fr") {
response = "Bonjour"
} else {
response = "Hello"
}
return response + " " + name
}
greet("Ted", "fr"); // => "Bonjour Ted"
greet = _.wrap(greet, function(old_greet, lang){ return old_greet("Ted", lang); } );
greet("sp"); // => "Hola Ted"
感谢您的快速回复。 这非常有帮助。
我正在使用骨干开发企业应用程序。
view.js
var view = Backbone.View.extend({
authorizeCreateAction:function(){
//这里“ this”指向查看
this.createAlert:_.wrap(this.createAlert,function(_createAlert,_type){
//授权创建动作
返回_createAlert(_type);
});
},
createAlert:函数(类型){
//问题:
//这里的“ this”指向[window global]
}
});
当我直接调用createAlert函数时,它在createAlert函数内部看到,它指向视图,但是当我编写包装函数时,它开始指向[window global]
我想更改其引用以指向“视图”
我是下划线的新手,如果问题无关紧要,请忽略。
BTW下划线很棒
您需要使用如下上下文调用_createAlert
。 希望能有所帮助。 :)
return _createAlert.call(this, _type);
下划线_wrap似乎仅支持一个参数,请改用此参数:
fn =(function(fn,before,after,self){
return function(){
if(before)before.apply(self,arguments);
var res = fn.apply(self,arguments);
if(after)after.apply(self,arguments);
返回资源;
}
})(fn,在此之前,之后)
您也可以为该zarehb使用partial
tnx megawac,partial更多用于预填充参数而不调用before和after函数
包装是通过_.partial
fyi实现的
fn = _.partial(function(fn, before, after, self) {
var args = _.rest(arguments, 4);
if (before) before.apply(self,args);
var res = fn.apply(self,args);
if (after) after.apply(self,args);
return res;
})(fn, before, after, this )
没错,它可以正常工作,但是如果有人希望使用纯js解决方案,可以特别考虑下划线在这种情况下不会给您带来任何好处!