Underscore: _.wrapは、引数付きのラッピング関数をサポートしていません

作成日 2013年03月09日  ·  8コメント  ·  ソース: jashkenas/underscore

今日、アンダースコアとバックボーンを使用してコードを記述しているときに、いくつかの関数をラップする必要がありました。 underscorejs.orgで次の例を見ました

var hello = function(name){return "hello:" + name; };
hello = _.wrap(hello、function(func){
return "before、" + func( "moe")+ "、after";
});
こんにちは();
=> '前、こんにちは:萌え、後'

最後から2番目の行
関数呼び出しが次のような場合はどうなりますか
hello( "umar");
私は議論が外部から来ていると言うことを意味します。

question

全てのコメント8件

ラップはすでにあなたのためにこれのほとんどを処理します。 ラップのソースは、読み通すのにかなり短いです。 それまたはあなたは以下の拡張された例をざっと見ることができます:

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ソリューションが必要な場合は、アンダースコアを使用してもこの場合は何のメリットもないことを特に理解できます。

このページは役に立ちましたか?
0 / 5 - 0 評価