javascript_javascriptスキルのカリー化機能の紹介
初期のカリー関数は少し多態性がありました。つまり、分岐は関数パラメーターに基づいて内部的に選択されました。
//http://www.openlaszlo.org/pipermail/laszlo-user/2005-March/000350.html
// ★★2005 年 3 月 8 日、 00:06、Steve Albin は次のように書きました:
function add(a, b) {
if (arguments.length < 1) {
return add
} else if (arguments.length < 2) {
return function(c) { return a c }
} else {
return a b;
}
}
var myadd = add( 2 ); 🎜>var total = myadd(3);
if (typeof fun != 'function') {
throw new Error("引数は関数である必要があります。")
}
if (fun.arity == 0) {
throw new Error( "関数には複数の引数が必要です。");
}
var funText = fun.toString()
var args = /function .*((.*) )(. *)/.exec(funText)[1].split(', ');
var firstArg = args.shift();
varrestArgs = args.join(', '); 🎜>var body = funText.replace(/function .*(.*) /, "");
var curriedText =
"function (" firstArg ") {"
"return function ("restArgs")"body
"}";
eval("var curried =" curriedText);
return curried;
}
[Ctrl A すべて選択 注: 外部 Js を導入する必要がある場合は、 を実行するために更新する必要があります]
関数カレー (fn, スコープ) {
var スコープ = スコープ ||
var args = [];
for (var i=2, len = argument.length; i args.push(arguments[i]);
return function() {
fn.apply(scope, args);
一般的なカリー化関数には 2 つの関数しかありません。実行状況は次のようになります。1 回目の実行ではパラメータが不足しており、内部関数に戻り、2 回目の実行で最終的に完了します。ただし、このパラメータに関するいくつかの記事はまだ作成できます。次の関数を見てください:
コードをコピー
return result;
}
alert(sum(1,2,3,4,5)); // 15
であれば、いわゆるパラメータ不足の問題はありません。パラメータを渡すと、計算も行われます。しかし、パラメーターが渡されない場合はどうなるでしょうか?そうですね、パラメータがあるかないかの違いです。パラメーターが存在する場合は、それ自体を継続的に実行させることができます。最後に、パラメーターなしで 1 回実行されます。つまり、前の手順はパラメータを保存するために使用されます。
コードをコピーします
一般的なカリー化関数と比較すると、これは少し難しいです。詳細についてはコメントを参照してください:
var curry= function(fn){//原函数的参数为函数
return function(args){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
//args是相对于第三重内部函数可是全局变量
var self= arguments.callee;//把自身保存起来(就是那个数组为参数的第二重函数)
return function(){ //这才是第二次调用的函数
if(arguments.length){//如果还有要添加的参数
[].push.apply(args,arguments);//apply把当前传入的所有参数放进args中
return self(args);
}else{
return fn.apply(this,args);//apply的第二参数为数组
}
}
}([]);
};
function sum(){
var result=0;
for(var i=0, n=arguments.length; i
}
return result;
};
var curry = function(fn){//原函数的参数为函数
return function(args){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
var self= arguments.callee;//把自身保存起来
return function(){ //这才是第二次调用的函数
if(arguments.length){//如果还有要添加的参数
[].push.apply(args,arguments);
return self(args);
}
else return fn.apply(this,args);//执行
}
}([]);
};
var sum2= curry(sum);
sum2= sum2(1)(2)(3)(4)(5);
alert(sum2());
或者每次传入多个参数:
function sum(){
var result=0;
for(var i=0, n=arguments.length; i
}
return result;
};
var curry = function(fn){//原函数的参数为函数
return function(args){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
var self= arguments.callee;//把自身保存起来
return function(){ //这才是第二次调用的函数
if(arguments.length){//如果还有要添加的参数
[].push.apply(args,arguments);
return self(args);
}
else return fn.apply(this,args);//执行
}
}([]);
};
var sum2= curry(sum);
sum2= sum2(1,2,3);
sum2= sum2(4,5,6);
sum2= sum2(7,8,9);
alert(sum2());
但上面的函数有不足之处,最后怎么也要放个括号,我们想只要参数足够就返回结果,多出的参数忽略。改进如下:
function curry(f) {
if (f.length == 0) return f;
function iterate(args) {
if (args.length <= f.length)
return f.apply(null, args);
return function () {
return iterate(args.concat(Array.prototype.slice.call(arguments)));
};
}
return iterate([]);
}
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

この記事シリーズは、2017年半ばに最新の情報と新鮮な例で書き直されました。 このJSONの例では、JSON形式を使用してファイルに単純な値を保存する方法について説明します。 キー価値ペア表記を使用して、あらゆる種類を保存できます

楽なWebページレイアウトのためにjQueryを活用する:8本質的なプラグイン jQueryは、Webページのレイアウトを大幅に簡素化します。 この記事では、プロセスを合理化する8つの強力なjQueryプラグイン、特に手動のウェブサイトの作成に役立ちます

コアポイント これは通常、メソッドを「所有」するオブジェクトを指しますが、関数がどのように呼び出されるかに依存します。 現在のオブジェクトがない場合、これはグローバルオブジェクトを指します。 Webブラウザでは、ウィンドウで表されます。 関数を呼び出すと、これはグローバルオブジェクトを維持しますが、オブジェクトコンストラクターまたはそのメソッドを呼び出すとき、これはオブジェクトのインスタンスを指します。 call()、apply()、bind()などのメソッドを使用して、このコンテキストを変更できます。これらのメソッドは、与えられたこの値とパラメーターを使用して関数を呼び出します。 JavaScriptは優れたプログラミング言語です。数年前、この文はそうでした

jQueryは素晴らしいJavaScriptフレームワークです。ただし、他のライブラリと同様に、何が起こっているのかを発見するためにフードの下に入る必要がある場合があります。おそらく、バグをトレースしているか、jQueryが特定のUIをどのように達成するかに興味があるからです

この投稿は、Android、BlackBerry、およびiPhoneアプリ開発用の有用なチートシート、リファレンスガイド、クイックレシピ、コードスニペットをコンパイルします。 開発者がいないべきではありません! タッチジェスチャーリファレンスガイド(PDF) Desigの貴重なリソース
