Lambda 式と同様のプログラミング機能を JavaScript に与えるメソッド_JavaScript スキル
しかし、私は後で人々に、受け入れられるパラメーターが多すぎるため、スマートプロンプトが明確に書かれていない場合、私ですらその使用方法を理解できないことがよくあると話しました。
しかし、多くのパラメーターを受け入れると、それらを誤って使用しやすくなるだけでなく、別の問題が発生する可能性があるため、今日リリースされたものを作成しました。
ページ番号レンダリング コンポーネントの JS バージョンの完全な関数シグネチャを見てみましょう:
function pnView(
currentPage, actionCurrent,
beginPage, endPage,
actionBegin, actionEnd,
currentSiblings, actionCurrentSibling,
preventFolding 、actionFolding、
endOfBegin、beginOfEnd 、
actionBeginSibling、actionEndSibling
)
ご覧のとおり、この完全にカスタマイズされた関数シグネチャは 14 個のパラメーターを受け入れ、そのうちの半分、つまり 7 個です。コールバック関数を受け入れるにはパラメータが必要です。
結果として生じる問題は、次のように複数の「function(){}」と他の文字の組み合わせを手動で記述する必要があることです:
function ww(s) { document.write(s) }
function ws(n) { ww(' (' n ') }
pnView(14, function (n) { ww(' [' n '] ') },
1, 27 ,
関数 (n) { ww('|< ' n ' '); 関数 (n) { ww(' ' n ' >|'); },
2, ws,
1, function () { ww(' ... '); 🎜 >2, 2,
ws, ws
);
このため、JS コードを変換し、特定のパターンを関数定義に変換できるこのモジュールを作成しました。
このモジュールを使用した後、前の呼び出しは次のようになります:
var ww = (s, document.write(s));
var ws = (n, ww(' (' n ') '));
pnView(14, (n, ww(' [' n '] ')),
1, 27,
(n , ww('|< ' n ' ')), (n, ww(' ' n ' > |')),
2, ws,
1, (0, ww(' ... ')),
2, 2,
ws, ws
);
}.lamda())();
/*!
L-amda「a-Lambda」モジュールは、JavaScript に代替「Lambda」スタイルのプログラミング機能を提供します。
ナナリッチによって作成されました。 2010-09-08
このモジュールは WTFPL v2 で公開されているため、Fxxx で必要なことを行うだけです。
*/
!function () {
functionattachEntry(o, a, m) {
var i, j, n;
o = [].concat(o);
//if (!(o 配列のインスタンス)) o = [o];
while (i = o.shift()) {
for (j in a) {
if (!i[n = a[j]]) i[n] = m;
}
}
}
var rx0 = /^s*(0|NaN|null)s*,$/;
var rx1 = /([W]s*)((s*0s*,|(?:s*[a-z_$][w$]*s*,) )|"(\[sS] |[^x22])*"|'(\[sS]|[^x27])*'/gi;
var rx2 = /)/g;
function rxGetFlags(rx) { // 正表表式の取出
return (rx.global ? 'g' : '') (rx.ignoreCase ? 'i' : '') (rx.multiline ? 'm' : '');
//return //([gim]*)$/.exec('' rx)[1];
}
attachEntry(RegExp, ['getFlags'], rxGetFlags);
attachEntry(RegExp.prototype, ['getFlags'], function () {
return rxGetFlags(this);
});
function translationLambda(s) {
if (typeof (s) != 'string') s = '' s;
var x = new RegExp(rx1.source, rx1.getFlags());
var y = new RegExp(rx2.source, rx2.getFlags()); // firefox、safari などの完全なローカルマッチングの正表式の拡張のため、ここでは重複しない正表表式の例を採用しています。
var m, l = 0, r = '' ;
while (m = x.exec(s)) {
var c = m[0], h, p, q, t;
switch (c.charAt(0)) { // 判断期待的语法成分
case '$':
case ')':
case ']':
case '" ':
case "'":
Continue; // 関数数传参,跳过
}
h = m[2]
if (rx0.test(h) ))
h = '';
else
h = h.substr(0, h.length - 1) // 去掉末尾の逗号
r = s.substring(l, p) = m.index); // 在结果字符串上附之前残り内容
y.lastIndex = l = p c.length // 从逗号之後開始寻找右括号
while (q = y) .exec(s)) {
q = q.index;
try {
t = 'return ' s.substring(l, q) ';'
new Function(t); // 语法测试
//r = c 'function(' h '){ ' translationLambda(t) ' }' // 翻訳里面の内容
r = m[1] 'function(' h '; ){ ' translationLambda(t) ' }'; // 翻译里面の内容
x.lastIndex = l = q 1; // 下一次查找从括号之后开開始
break
} ) { }
}
if (!q) l = p // 说明找不到右单号或者有效的代码,直接追加すべて適合的内容
}
try {
r = s.substr(l);
if (/[w$]*|"(\[sS]|[^x22])*"|'(\[sS]|[^x27])*' /.exec(r)[0] == 'function') // 粗略判断生成的是不是関数数(可以应付绝大部分情况)
r = '0,' r // この种“怪”を使用します。 ” 形式は、すべてのブラウザ (IE を含む) で予期された結果を得ることができます。
new Function(r) // 语法测试
return
} catch (ex) { // 失敗、返される文
s を返します。
}
};
var lamdaAliases = ["translateLambda", "lambda", "lamda"];
attachEntry([関数, 文字列], lamdaAliases, translationLambda);
attachEntry([Function.prototype, String.prototype], lamdaAliases, function () {
return translationLambda(this);
});
} ();
如果および C# における Lambda 表式の相対的话、我的この模块还有很多不足,不过现在这个样子已经让我很满意了,少なくとも我不使用再多多的
簡単に言えば、このモジュールの仕様特性は次のとおりです—
利点:
コード書き込み時の「関数」の出現回数を減らします。
は一般的な JavaScript で使用できます。
限定的:
このモジュールを使用するときは常に、変換メソッド ("translateLambda"、") を使用する必要があります。 lambda" または "lamda")と eval 関数、省略なし;
関数 A が存在する場合、A への処理を介して A への转译伝達のパラメータの目的に到達することはできません(说a.lambda() または同様の操作は許可されません。a((x, x * 2)) と同等の a(function(x){ return x * 2; }));
は表式以外のいかなる句も含めることはできません。
の注意点:
連続して表示される括弧番号は理解が難しくなる可能性があります;
はラムダ表式に対応できません;
🎜> 危険な暗号化の可能性が存在します。このモジュールが適合を実行するために選択されるモードは、通常の暗号化には使用されず、通常は出現しないモードです。たとえば、(x, x * 2) などです。単一の x * 2、(0, a.method()) などは単一の a.method() に由来するため、この点は 0 に限りなく近いコードを実行する可能性があります。不適切な使用方法:
1、このモジュールを使用し、多世代コード量を節約できない場合: 本末転倒。代幣如下:
eval(function(){ // コード量が減らなかっただけでなく、コード量も増えました。
window.onload = (0,alert('Loading completed!'));
}.lambda());
2. パラメーターを受け入れる関数を変換する: この状況は前に説明しました。
eval(somefunction.lambda())( (x, x.toString(16))); // 一部の関数は予期しない結果を生成する可能性があり、受け取ったパラメーターは x.toString(16) の結果になります (x がここで定義されていない場合は、 「変数が存在しない」例外)、コールバック関数ではなく。
3. このモジュールを使用するための構文チェックの回避:
JavaScript では有効ですが実用的な価値がない構文を使用しているため、構文チェックを回避する必要はありません。
eval("somefunction((x, x .toString( 16)))".lamda()); // 構文チェックが失われるため、実行時に事故が発生する可能性があります
4. (擬似) Lambda での演算が多すぎて、さらに多くのステートメントが使用されます:
このモジュールを設計するときに、複数のステートメントを使用して構文チェックに合格できるパターンが見つかりませんでした。その理由は、Lambda 式で複数のステートメントを使用するときに、「関数」によって追加されるコードの量が増えるためです。 「return」などの少数の文字は、通常、このようにラムダ式を使用すると、本来の意図から逸脱する可能性があります。
eval(function(){ somefunction(( x, y .something(x); return x.toString(16))); }.lamda())(); // 構文エラー
eval(){ somefunction((x, y.something() x), x.toString(16))); }.lamda())(); // 理解が曖昧になりやすい
eval(function(){ somefunction((x, x)); } .lamda()) (); // 単純な式を受け入れることができます
ベストユースケース:
現在、多くの人が JavaScript を記述するときにコードをクロージャーで記述することを好みます。次のように、グローバル スコープの汚染問題を回避します。
(function(){
// すべてのコードはここに配置されます
})();
- この「大きな」クロージャはたまたまこのモジュールを使用しています。
eval(function(){ // 追加括弧の前の eval
// すべてのコードはここに配置されます
}.lamda())() // 括弧内に .lamda() を追加します
昨日 Codeplex がおかしくなりました、コードとリリースのアップロードには常にエラーが発生します。このモジュールの使用例は比較的限定されており、JavaScript の経験が浅い人には適していないことを考慮して、ソース コードはパッケージ化されておらず、個別にダウンロードされません。必要に応じてテキストから直接コピーしてください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









C++ では、Lambda 式を使用して例外を処理する方法が 2 つあります。try-catch ブロックを使用して例外をキャッチする方法と、catch ブロックで例外を処理または再スローする方法です。 std::function 型のラッパー関数を使用すると、その try_emplace メソッドで Lambda 式の例外をキャッチできます。

C++ では、クロージャは外部変数にアクセスできるラムダ式です。クロージャを作成するには、ラムダ式の外部変数をキャプチャします。クロージャには、再利用性、情報の隠蔽、評価の遅延などの利点があります。これらは、イベント ハンドラーなど、外部変数が破棄されてもクロージャが外部変数にアクセスできる現実の状況で役立ちます。

C++ マルチスレッド プログラミングにおけるラムダ式の利点には、シンプルさ、柔軟性、パラメータの受け渡しの容易さ、並列処理が含まれます。実際のケース: ラムダ式を使用してマルチスレッドを作成し、異なるスレッドでスレッド ID を出力します。これは、このメソッドのシンプルさと使いやすさを示しています。

C++ ラムダ式は、関数スコープ変数を保存し、関数からアクセスできるようにするクロージャーをサポートしています。構文は [キャプチャリスト](パラメータ)->戻り値の型{関数本体} です。 Capture-list は、キャプチャする変数を定義します。[=] を使用してすべてのローカル変数を値によってキャプチャするか、[&] を使用してすべてのローカル変数を参照によってキャプチャするか、[variable1, variable2,...] を使用して特定の変数をキャプチャできます。ラムダ式はキャプチャされた変数にのみアクセスできますが、元の値を変更することはできません。

C++ で外部変数のラムダ式をキャプチャするには、次の 3 つの方法があります。 値によるキャプチャ: 変数のコピーを作成します。参照によるキャプチャ: 変数参照を取得します。値と参照による同時キャプチャ: 値または参照による複数の変数のキャプチャを許可します。

C++ では、ラムダ式を関数パラメータとして使用して、コールバック関数の柔軟性を実現できます。具体的には: パラメーターの受け渡し: std::function を介して Lambda 式をラップし、関数ポインターの形式で関数に渡します。戻り値の処理: std::functionでコールバック関数のポインタを宣言する際の戻り値の型を指定します。実践的なケース: GUI イベント処理のコールバックを最適化し、不要なオブジェクトや関数ポインターの作成を回避し、コードの単純さと保守性を向上させます。

C++ ラムダ式を使用して遅延評価を実行するにはどうすればよいですか?ラムダ式を使用して、遅延評価される関数オブジェクトを作成します。遅延計算により、必要になるまで実行が延期されます。必要な場合にのみ結果を計算し、パフォーマンスを向上させます。

C++ ラムダ式を最適化するためのパフォーマンスのヒントは次のとおりです。 ラムダ オブジェクトの不必要な作成を回避する std::bind を介して最小のオブジェクトを明示的にキャプチャする コピーを避けるために std::move を使用してキャプチャされた変数を移動する 不必要なメモリ割り当て、計算の繰り返しを回避するためにラムダ本体を最適化するグローバル変数へのアクセス
