しかし、私は後で人々に、受け入れられるパラメーターが多すぎるため、スマートプロンプトが明確に書かれていない場合、私ですらその使用方法を理解できないことがよくあると話しました。
しかし、多くのパラメーターを受け入れると、それらを誤って使用しやすくなるだけでなく、別の問題が発生する可能性があるため、今日リリースされたものを作成しました。
ページ番号レンダリング コンポーネントの JS バージョンの完全な関数シグネチャを見てみましょう:
ご覧のとおり、この完全にカスタマイズされた関数シグネチャは 14 個のパラメーターを受け入れ、そのうちの半分、つまり 7 個です。コールバック関数を受け入れるにはパラメータが必要です。
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
);
Web ページでこのコンポーネントをテストしたとき、C# の Lambda 式を見逃しているように感じましたが、人によってはまた、一部の JS フレームワークは匿名関数を「ラムダ式」と呼びますが、実際には、これは C# の「匿名デリゲート/関数」と同等であるだけであり、Lambda の (表面的な) 特徴は、(コールバック) を反映するために短い構文パターンを使用することです。 ) 「デリゲート」や他のキーワードに惑わされることなく、関数/プロシージャ (またはアクション) ロジックを理解できます。
eval(function () {
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())();
コピーcode コードは次のとおりです:
/*!
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 の経験が浅い人には適していないことを考慮して、ソース コードはパッケージ化されておらず、個別にダウンロードされません。必要に応じてテキストから直接コピーしてください。