今日、アンダースコアとバックボーンを使用してコードを記述しているときに、いくつかの関数をラップする必要がありました。 underscorejs.orgで次の例を見ました
var hello = function(name){return "hello:" + name; };
hello = _.wrap(hello、function(func){
return "before、" + func( "moe")+ "、after";
});
こんにちは();
=> '前、こんにちは:萌え、後'
最後から2番目の行
関数呼び出しが次のような場合はどうなりますか
hello( "umar");
私は議論が外部から来ていると言うことを意味します。
ラップはすでにあなたのためにこれのほとんどを処理します。 ラップのソースは、読み通すのにかなり短いです。 それまたはあなたは以下の拡張された例をざっと見ることができます:
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){
//作成アクションを承認します
return _createAlert(_type);
});
}、
createAlert:function(type){
//問題:
//ここで、「this」は[windowglobal]を指します
}
});
createAlert関数を直接呼び出していたときは、createAlert関数の内部を参照してください。ビューを指していますが、ラッパー関数を作成すると、[windowglobal]を指しています。
これの参照を「ビュー」を指すように変更したい
私はアンダースコアを初めて使用します。質問が無関係である場合は無視してください。
ところでアンダースコアは素晴らしいです
以下のようなコンテキストで_createAlert
を呼び出す必要があります。 それがお役に立てば幸いです。 :)
return _createAlert.call(this, _type);
アンダースコア_wrapは1つのパラメーターのみをサポートしているようです。代わりに、これを使用してください。
fn =(function(fn、before、after、self){
function()を返す{
if(before)before.apply(self、arguments);
var res = fn.apply(self、arguments);
if(after)after.apply(self、arguments);
解像度を返します。
}
})(fn、before、after、this)
そのzarehbに部分的に使用することもできます
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ソリューションが必要な場合は、アンダースコアを使用してもこの場合は何のメリットもないことを特に理解できます。