> 웹 프론트엔드 > JS 튜토리얼 > JavaScript에는 Lambda 표현식 프로그래밍 기능(향상된 버전)_javascript 기술과 유사한 코드가 있습니다.

JavaScript에는 Lambda 표현식 프로그래밍 기능(향상된 버전)_javascript 기술과 유사한 코드가 있습니다.

WBOY
풀어 주다: 2016-05-16 18:19:39
원래의
1272명이 탐색했습니다.

블로그 게시물을 게시한 후 이 문제를 해결하기 위해 시간을 보냈습니다... 몇 번의 시도 끝에 괄호가 더 이상 필요하지 않은 또 다른 패턴을 발견했습니다: ​​

코드 복사 코드는 다음과 같습니다.

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());

그러나 연산자 우선 순위, 비교, 할당 및 기타 연산자 간의 관계로 인해 여전히 (의사) 람다 표현식에 직접 작성할 수 없습니다.


코드 복사 코드는 다음과 같습니다.
함수( a, b) { a == b }

은 여전히 ​​

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


또한 선택한 패턴 자체에도 실질적인 효과가 있습니다 - 배열을 다른 것과 결합할 때 스크립트 엔진은 먼저 양쪽을 숫자 값으로 변환하려고 시도합니다. 실패하면 문자열로 변환한 다음 비교합니다.
하지만 일반적인 상황에서는 배열을 이와 같은 다른 것과 비교하는 사람이 거의 없을 것이라고 생각합니다. 따라서 의도적으로 사용하지 않는 한 배열을 적극적으로 피할 필요조차 없습니다. (의사) 람다 표현식이 필요합니다. 더 이상 문제가 없습니다.

새 구현 코드는 다음과 같습니다.


코드 복사 코드는 다음과 같습니다.

/*!
L-amda "a-Lambda" 모듈은 JavaScript에 대한 대체 "Lambda" 스타일 프로그래밍 기능을 제공합니다.
NanaLich가 제작했습니다. 2010-09-10
이 모듈은 WTFPL v2에 따라 게시되었으므로 원하는 Fxxx 작업을 수행하면 됩니다.
*/
!function () {
function attachmentEntry(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 ? ' 중' : ''));
}
attachEntry(RegExp, ['clone'], rxClone);
attachEntry(RegExp.prototype, ['clone'], function () { return rxClone(this); });
functiontranslateLambda(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) ');'
new Function(t); r = m[1] 'function(' m[2] '){ 'translateLambda(t) ' }' // 翻译里面的内容
x.lastIndex = l = q k; // 下一次查找从当前边界之后开始
break
} catch (ex) { }
}
if (!q) l = p // 说明找不到右括号或者有效的代码,直接附加所有匹配的内容
}
try {
r = s.substr(l);
new Function(r) // 语法测试
return
} catch(예: ) { // 失败,返回原文
return s;
}
};
var lamdaAliases = ["translateLambda", "lambda", "lamda"]; lamdaAliases,translateLambda);
attachEntry(String.prototype, lamdaAliases, function () { returntranslateLambda(this); });
var funPrototype = Function.prototype;
attachEntry(Function, lamdaAliases, function (func) { returntranslateLambda('0,' func); });
attachEntry(funPrototype, lamdaAliases, function () { return analyzeLambda('0,' this); });
var lamda0aliases = ['lambdaInit', 'lambda0', 'lamda0'];
attachEntry(Function, lamda0aliases, function (func) { returntranslateLambda('!' func '()'); });
attachEntry(funPrototype, lamda0aliases, function () { return analyzeLambda('!' this '()'); });
} ();
另外由于Codeplex再次抽疯,这次还是没有下载。
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿