JavaScript에 Lambda 표현식_javascript 기술과 유사한 프로그래밍 기능을 제공하는 방법
하지만 나중에 사람들에게 너무 많은 매개변수를 허용하기 때문에 스마트 프롬프트가 명확하게 작성되지 않으면 나조차도 사용법을 알 수 없는 경우가 많다고 말했습니다.
그러나 많은 매개 변수를 허용하면 잘못 사용하기 쉬울 뿐만 아니라 또 다른 문제가 발생할 수도 있습니다.
페이지 번호 렌더링 구성 요소 JS 버전의 전체 기능 서명을 살펴보겠습니다.
function pnView(
currentPage, actionCurrent,
beginPage, endPage,
actionBegin, actionEnd,
currentSiblings, actionCurrentSibling,
preventFolding , actionFolding,
endOfBegin, startOfEnd ,
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" 스타일 프로그래밍 기능을 제공합니다.
NanaLich가 제작했습니다. 2010-09-08
이 모듈은 WTFPL v2에 따라 게시되었으므로 원하는 Fxxx 작업을 수행하면 됩니다.
*/
!function () {
function attachmentEntry(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 ? '중' : '');
//return //([gim]*)$/.exec('' rx)[1];
}
attachEntry(RegExp, ['getFlags'], rxGetFlags);
attachEntry(RegExp.prototype, ['getFlags'], function () {
return rxGetFlags(this);
});
functiontranslateLambda(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 '){ 'translateLambda(t) ' }' // 翻译里面적内容
r = m[1] 'function(' h ' ){ 'translateLambda(t) ' }'; // 翻译里面的内容
x.lastIndex = l = q 1; // 下一次查找从括号之后开始
break
} catch; ) { }
}
if (!q) l = p; // 说明找不到右括号或者有效的代码,直接附加所有匹配的内容
}
try {
r = s.substr(l);
if (/[w$]*|"(\[sS]|[^x22])*"|'(\[sS]|[^x27])*' /.exec(r)[0] == '함수') // 粗略判断产生的是不是函数(可以应付绝大分情况)
r = '0,' r // 使用这种“怪”형式可以현재所有浏览器(包括IE)中得到预期的效果
new Function(r); // 语法测试
return
} catch (ex) { // 失败,返回原文
s를 반환합니다;
}
};
var lamdaAliases = ["translateLambda", "lambda", "lamda"];
attachEntry([함수, 문자열], lamdaAliases, 번역Lambda);
attachEntry([Function.prototype, String.prototype], lamdaAliases, function () {
returntranslateLambda(this);
});
} ();
简单来说, 这个模块的规格特性是这样的——
优点:
减少编写代码时“함수”를 출력합니다
使JavaScript를 사용하는 방법 |模块道必须调사용转译方法(“translateLambda”、“ 람다” 또는 “람다”) 및 평가판 函数 , 无법성 略;
就是说a.lambda()或者类似的操作并不会让a((x, x * 2))等同于a(function(x){ return x * 2; }));
不能包含表达式之不胻何语句、不能包含使用“;”来分隔的多条语句.
缺点:
连续出现的括号可能会让代码变得难以理解;
任何编辑器无法为Lambda表达式提供语法高亮;
存在错误地转译现有代码的可能性——这个模块选择进行匹配的模式是는 正常的代码中没有实用价值, 也会常不可能性模式,如:(x, x * 2)等价于单纯的x * 2、(0, a.method())等价于单纯的a.method(),所以这个缺点影响到实际代码的可能性无限趋近于0。
以下是几种不当적 용법:
1、使用这个模块并不会节省很多代码时候:本末倒置。
2. 매개변수를 받는 함수 변환: 이 상황은 이전에 언급되었습니다.
코드 복사
JavaScript에서는 유효하지만 실질적인 가치가 없는 구문을 사용하므로 구문 검사를 피할 필요가 없습니다.
코드 복사
이 모듈을 설계할 때 여러 문을 사용하고 구문 검사를 통과할 수 있는 패턴을 찾지 못했습니다. 그 이유는 람다 표현식에서 여러 문을 사용할 때 "함수"에 의해 추가되는 코드의 양 때문입니다. "return"과 같은 소수의 문자는 일반적으로 무시할 수 있습니다. 이런 방식으로 람다 표현식을 사용하면 원래 의도에서 벗어납니다.
코드 복사
최고의 사용 사례:
이제 많은 사람들이 JavaScript를 작성할 때 클로저에 코드를 작성하는 것을 좋아합니다. 다음과 같이 전역 범위 오염 문제를 피하십시오.
코드를 복사하세요.
- 이 "큰" 클로저는 이 모듈을 사용합니다.
코드 복사
어제 Codeplex가 미쳤습니다. , 코드 및 릴리스 업로드에는 항상 오류가 있습니다. 본 모듈의 사용 사례가 상대적으로 제한적이고 JavaScript 경험이 부족한 사람들에게는 적합하지 않다는 점을 고려하여 소스 코드는 별도로 패키지되어 다운로드되지 않습니다. 필요한 경우 텍스트에서 직접 복사하십시오.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C++에는 Lambda 표현식을 사용하여 예외를 처리하는 두 가지 방법이 있습니다. 즉, try-catch 블록을 사용하여 예외를 포착하고, catch 블록에서 예외를 처리하거나 다시 발생시킵니다. std::function 유형의 래퍼 함수를 사용하면 try_emplace 메서드가 Lambda 표현식에서 예외를 포착할 수 있습니다.

C++에서 클로저는 외부 변수에 액세스할 수 있는 람다 식입니다. 클로저를 생성하려면 람다 표현식에서 외부 변수를 캡처하세요. 클로저는 재사용성, 정보 숨기기, 지연 평가와 같은 이점을 제공합니다. 이는 클로저가 외부 변수가 파괴되더라도 여전히 접근할 수 있는 이벤트 핸들러와 같은 실제 상황에서 유용합니다.

C++ 다중 스레드 프로그래밍에서 람다 식의 장점에는 단순성, 유연성, 매개 변수 전달 용이성 및 병렬성이 포함됩니다. 실제 사례: 람다 식을 사용하여 다중 스레드를 만들고 다른 스레드에서 스레드 ID를 인쇄하여 이 방법의 단순성과 사용 용이성을 보여줍니다.

C++ Lambda 표현식은 함수 범위 변수를 저장하고 함수에 액세스할 수 있도록 하는 클로저를 지원합니다. 구문은 [캡처 목록](매개변수)->return-type{function-body}입니다. 캡처 목록은 캡처할 변수를 정의합니다. [=]를 사용하여 모든 지역 변수를 값으로 캡처하고, [&]를 사용하여 모든 지역 변수를 참조로 캡처하거나, [변수1, 변수2,...]를 사용하여 특정 변수를 캡처할 수 있습니다. 람다 표현식은 캡처된 변수에만 액세스할 수 있지만 원래 값을 수정할 수는 없습니다.

C++에서 외부 변수의 람다 식을 캡처하는 방법에는 세 가지가 있습니다. 값으로 캡처: 변수의 복사본을 만듭니다. 참조로 캡처: 변수 참조를 가져옵니다. 값 및 참조로 동시에 캡처: 값 또는 참조로 여러 변수를 캡처할 수 있습니다.

C++에서는 Lambda 표현식을 함수 매개 변수로 사용하여 콜백 함수의 유연성을 얻을 수 있습니다. 구체적으로 설명하면 다음과 같습니다. 매개변수 전달: std::function을 통해 Lambda 표현식을 래핑하고 이를 함수 포인터 형식으로 함수에 전달합니다. 반환 값 처리: std::function을 사용하여 콜백 함수 포인터를 선언할 때 반환 값 유형을 지정합니다. 실제 사례: GUI 이벤트 처리에서 콜백을 최적화하고, 불필요한 객체나 함수 포인터 생성을 방지하고, 코드 단순성과 유지 관리성을 향상시킵니다.

C++ 람다 표현식을 사용하여 지연 평가를 수행하는 방법은 무엇입니까? 지연 평가 함수 개체를 만들려면 람다 식을 사용하세요. 지연된 계산은 필요할 때까지 실행을 연기합니다. 필요한 경우에만 결과를 계산하여 성능을 향상시킵니다.

C++ 람다 표현식 최적화를 위한 성능 팁은 다음과 같습니다. 불필요한 람다 객체 생성 방지 std::bind를 통해 가장 작은 객체를 명시적으로 캡처 std::move를 사용하여 캡처된 변수를 이동하여 복사 방지 람다 본문을 최적화하여 불필요한 메모리 할당, 반복 계산 및 전역 변수 액세스
