방금 갑자기 아이디어가 떠올랐습니다. 다음 단계로 이동하여 반복자를 직접 순회하는 경우는 거의 없는데 왜 이 다음 단계를 구현해야 합니까? 이렇게 차례로 각각을 직접 구현하면 모든 것을 이해할 수 있고 곧 첫 번째 매우 간결한 버전을 작성했습니다.
functionyieldHost(yieldFunction)
{
반환 함수(프로세서)
{
var Yield = 함수(결과) )
{
processer(result)
};
yieldFunction(yield);
}
}
아이디어를 변경한 후 정말 간결해요.
먼저 예시를 첨부하고 원리에 대해 이야기해 보세요.
먼저 다음과 같이 열거할 함수가 필요합니다.
function fun(yield)
{
for (var i = 0; i < 100; i )
yield(i)
}
또는 이렇게:
function fun( Yield)
{
yield(1);
yield(3);
}
실제 적용을 위해 YieldHost 함수는 요구 사항을 충족하는 위의 재미있는 함수를 열거자로 변환할 수 있습니다.
var enumerator = YieldHost(fun)
이 열거자는 jQuery의 각 함수와 마찬가지로 실제로 함수입니다. , 열거형을 처리하는 핸들러 함수를 받습니다:
{
window.alert(item);
})
기존 열거자의 경우 열거자가 호출될 때마다 값을 반환해야 한다고 생각했지만 Chen Zihan이 말했듯이 이를 위해서는 항복 시 함수를 중지해야 합니다. 정말 귀찮습니다.
하지만! 실제로 대부분의 경우 foreach와 같은 구문을 사용하여 열거자에 액세스한다는 사실을 발견했습니다. 이는 다음 메서드를 구현하는 것이 아니라 각 메서드를 구현하는 매우 쉬운 방법을 제공합니다.
각 방법과 다음 방법의 차이점은 무엇인가요? jQuery에 익숙한 친구들은 각각의 메소드가 실제로는 열거형 값을 반환하는 대신 함수를 받아 열거형 값을 매개변수로 전달하는 것으로 간주할 수 있다는 것을 알 것입니다.
이번 조치로 모든 문제가 해결되었습니다. 함수 실행을 일시 중지할 필요는 없으며, 열거형 값을 처리하는 로직을 이 함수에 삽입하기만 하면 됩니다. 따라서 실제로 여기의 YieldHost는 열거자가 받은 함수(즉, window.alert(item))를 열거 함수(즉, fun)에 삽입하여 반전 작업을 완료했습니다.
{
window.alert(1);
window.alert(2);
window.alert(3)
}
이 매우 간단한 구현을 통해 다음 단계는 jQuery의 각 메서드처럼 중단에 대해 true를 반환하고 계속에 대해 false를 반환하는 함수를 구현하는 것입니다. 이러한 함수를 통해서만 무한 세트를 처리하거나 TakeWhile과 같은 함수를 구현할 수 있습니다. .
솔직히 말하면 JavaScript에 대한 연구가 철저하지 않습니다. 이것은 YieldHost의 두 번째 버전입니다.
코드 복사
{
try
{
yieldFunction(함수(결과)
{
if(프로세서(결과))
throw 예외;
} );
}
catch (e)
{
if (e !== 예외)
throw e;
물론 완벽하지는 않지만 이보다 더 좋은 것은 없습니다.
다음 단계는 이를 기반으로 Select와 Where를 구현하는 것입니다. 실제로는 매우 간단한 문제입니다.
function Select(enumerator, selector)
{
return function(fun)
{
enumerator (function (item )
{
return fun(selector(item));
})
}
}
수정하는 방법은 다음과 같습니다. 연속 버전을 선택하세요.
enumerator.Select( selector )( processor )
JavaScript에서는 이것이 정말 어려운 일이 아니라고 생각합니다. . . .
친숙한 구문을 조기에 도입하면 JavaScript가 매우 복잡하고 보기 흉해집니다. 그래서 나는 이것을 가지고 놀 수 있는 모든 사람에게 맡깁니다.