ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript にはラムダ式プログラミング機能と同様のコードがあります (改良版)_JavaScript スキル

JavaScript にはラムダ式プログラミング機能と同様のコードがあります (改良版)_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 18:19:391248ブラウズ

ブログ投稿を投稿した後、この問題を解決するためにしばらく時間を費やしました...数回試した後、括弧が不要になる別のパターンを見つけました:

コードをコピー コードは次のとおりです。

eval(function () {
var s = '', ww = [v] > ; (s = v);
var ws = [n] > ww(' (' n ') '); [n] > ww(' [' n '] ')、
1、37、
ws、[] > ww(' ... ')、
2、1
);
document.write(s);
} .lamda0());

ただし、演​​算子の優先順位、比較、ゲート、代入などの関係により、 (擬似) Lambda 式に直接記述することはできません。
つまり

コードをコピー コードは次のとおりです。
function( a, b) { a == b }

は、引き続き

[a, b] > (a == b)


さらに、選択したパターン自体にも実用的な効果があります。配列を別のものと組み合わせる場合 比較する場合、スクリプト エンジンはまず両方の値を数値に変換しようとしますが、失敗した場合は文字列に変換してから比較します。
しかし、通常の状況では、このように配列を他のものと比較する人はほとんどいないと思います。そのため、意図的にこのように使用しない限り、積極的に避ける必要さえありません。 (疑似) ラムダ式はもう必要ありません。

新しい実装コードは次のとおりです:


コードをコピーします コードは次のとおりです:

/*!
L-amda「a-Lambda」モジュールは、JavaScript に代替「Lambda」スタイルのプログラミング機能を提供します。
ナナリッチによって作成されました。 2010-09-10
このモジュールは WTFPL v2 で公開されているため、Fxxx で必要なことを行うだけです。
*/
!function () {
functionattachEntry(o, a, m) {
var i, j, n;
o = [].concat(o);
while (i = o.shift()) {
for (j in a) {
if (!i[n = a[j]]) i[n] = m;
}
}
}
var xx = /"(?:\[sS]|[^x22])*"|'(?:\[sS]|[^x27]) *'|([^sw]s*)[(s*|s*[A-Z$_][w$]*s*(?:,s*[A-Z$_][w$]*s*)* )]s*(>)s*((?)/gi;
var xy = /[nr),;]}]|$/.source;
function rxClone(rx) {
return new RegExp(rx.source, (rx.global ? 'g' : '') (rx.ignoreCase ? 'i' : '') (rx.multiline ? ' m':''));
}
attachEntry(RegExp, ['clone'], rxClone);
attachEntry(RegExp.prototype, ['clone'], function () { return rxClone(this); });
function translationLambda(s) {
var m, l = 0, r = '', x = xx.clone(); // firefox、safari などの完全なローカルマッチングの正表式の拡張のため、ここでは重複しない正表表式の例を採用しています。
while (m = x.exec(s)) {
var h = m[0];
switch (h.charAt(0)) { // 判断期待的语法成分
case '$': // 関数数传参
case ')':
case ']':
case '"': // 一致到了字符串
case "'":
Continue; //以上皆跳过
}
var p, q, t, k = m[ 4].length, y = new RegExp(k ? '\)' : xy, 'g');
r = s.substring(l, p = m.index); // 在结果文字列上附加前の残りの内容
y.lastIndex = l = p h.length; // 以降の開始寻找右記号またはその他の記号
while (q = y.exec(s)) {
q = q.index;
try {
t = 'return(' s.substring(l, q) ');'; // 语法测试
r = m[1] 'function(' m[2] '){ ' translationLambda(t) ' }'; // 翻译里面の内容
x.lastIndex = l = q k; // 下一次查找从当前边界之后開始
break;
} catch (ex) { }
}
if (!q) l = p; // 说明找不到右括号或者有效的代码,直接附加全部一致する内容
}
try {
r = s.substr(l);
new Function(r); // 语法测试
return
} catch (ex ) { // 失败、返還文
return s;
}
var
var lamdaAliases = ["translateLambda", "lambda"
attachEntry(String, lamdaAliases、translateLambda);
attachEntry(String.prototype, lamdaAliases, function () { return translationLambda(this); });
var funPrototype = Function.prototype;
attachEntry(Function, lamdaAliases, function (func) { return translationLambda('0,' func); });
attachEntry(funPrototype, lamdaAliases, function () { return translationLambda('0,' this); });
var lamda0aliases = ['lambdaInit', 'lambda0', 'lamda0'];
attachEntry(Function, lamda0aliases, function (func) { return translationLambda('!' func '()'); });
attachEntry(funPrototype, lamda0aliases, function () { return translationLambda('!' this '()'); });
} ();

次は関数数増加了专门的方法、去掉了前蹩足的判断、また追加新方法稍微简化调用过程;
修正了有额外空格時無法判断期待语法

さらに、Codeplex が再度解凍されたため、今回もダウンロードされていません。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。