逆に、デカリー化の役割は、本来は特定のオブジェクトが持つ関数である関数を、どのオブジェクトでも利用できるように、関数の適用範囲を拡張することです。は、以下に与えられる関数です。署名
obj.func(arg1, arg2)
func(obj, arg1, arg2)
Function.prototype.uncurrying = function() { var that = this; return function() { return Function.prototype.call.apply(that, arguments); } };function sayHi () { return "Hello " + this.value +" "+[].slice.call(arguments); }var sayHiuncurrying=sayHi.uncurrying(); console.log(sayHiuncurrying({value:'world'},"hahaha"));
javascript) のオブジェクトでもあります
var uncurrying= function (fn) { return function () { var args=[].slice.call(arguments,1); return fn.apply(arguments[0],args); } };
使用する場合は、uncurrying を呼び出して既存の関数 fn を渡します。decurrying 関数は新しい関数を返し、新しい関数によって受け入れられる最初の実パラメータは fn の this のコンテキストにバインドされ、他のパラメータが渡されます。 fn をパラメータとして指定します。
var test="a,b,c"; console.log(test.split(","));var split=uncurrying(String.prototype.split); //[ 'a', 'b', 'c' ]console.log(split(test,',')); //[ 'a', 'b', 'c' ]
var $ = {}; console.log($.push); // undefinedvar pushUncurrying = uncurrying(Array.prototype.push); $.push = function (obj) { pushUncurrying(this,obj); }; $.push('first'); console.log($.length); // 1console.log($[0]); // firstconsole.log($.hasOwnProperty('length')); // true
jqueryライブラリ」を模倣し、実装時にArrayのpushメソッドを借用します。 オブジェクトにはプッシュ メソッドがないことがわかっているため、console.log(obj.push) は未定義を返します。ネイティブ配列メソッド (JS エンジン) は長さ 属性 と配列メンバーを維持するために使用できます。擬似配列オブジェクト。
同様に、以下を継続できます:var indexof=uncurrying(Array.prototype.indexOf); $.indexOf = function (obj) { return indexof(this,obj); }; $.push("second"); console.log($.indexOf('first')); // 0console.log($.indexOf('second')); // 1console.log($.indexOf('third')); // -1
var call= uncurrying(Function.prototype.call);var fn= function (str) { console.log(this.value+str); };var obj={value:"Foo "}; call(fn, obj,"Bar!"); // Foo Bar!
を使用して、通常の「データ」として非常に柔軟に使用できます。これは一部のクラス ライブラリでよく見られます。 一般的なアンカリー化関数の攻撃
var uncurrying= function (fn) { return function () { var context=[].shift.call(arguments); return fn.apply(context,arguments); } };
リーリー
以上がJS でのアンチカリーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。