좋아요, 그래서 다른 함수에 함수를 전달할 수 있습니다. Passing a function to another function in Actionscript 3함수를 함수에 전달하는 것이 언제 의미가 있습니까?
이것은 분명 강력합니다. 그러나 더 중요한 질문은 언제 다른 기능을 호출 할 때마다 성능 오버 헤드가 발생합니까?
좋아요, 그래서 다른 함수에 함수를 전달할 수 있습니다. Passing a function to another function in Actionscript 3함수를 함수에 전달하는 것이 언제 의미가 있습니까?
이것은 분명 강력합니다. 그러나 더 중요한 질문은 언제 다른 기능을 호출 할 때마다 성능 오버 헤드가 발생합니까?
함수를 인수로 취하는 함수를 고차 함수이라고합니다. Google은 이것에 대한 많은 정보를 가지고 있습니다. higher-order 함수의
예 : 그와
function compose(f, g) {
return function(x) {
return f(g(x));
};
}
function map(f, xs) {
var ys = [];
for(var i = 0; i < xs.length; ++i)
ys.push(f(xs[i]));
return ys;
}
, 당신은 연속 두 가지 기능을 가진 배열을 변환 할 수 있습니다 : 당신이 많은 액션 스크립트 지식이있는 경우
var a = ["one", "two", "three"];
var b = map(compose(toUpperCase, reverse), a);
// b is now ["ENO", "OWT", "EERHT"]
1 예는 자바 스크립트 AJAX 호출
namespace.class.method(parm1, parm2, callback,onErr);
하는 서버에 asynchrously 실행하고,이 완료되면이있다
function callback(result) {
$('#myDiv').innerHTML = result;
}
전달되는 콜백 메소드를 실행하는 방법 예를 들어 이벤트 처리를 살펴보십시오.
당신은 아마 하나를 사용 예기치 않게 이런 모든 시간을
이 호출 실제로 함수가 그것으로 전달 될 필요 EventDispatcher 클래스의 또는 addEventListener : useCapture를 기능 : :
하여 addEventListener (유형 : 문자열, 청취자 부울 = 거짓, 우선 순위 : INT = 0,의 useWeakReference :) = 거짓 부울 : 보이드 주변 기능을 전달
http://livedocs.adobe.com/flex/3/langref/flash/events/EventDispatcher.html
많이의 대체를위한 사용 콜백. 다른 많은 용도가 있지만보다 간단한 시나리오 중 하나를 강조합니다.
성능 오버 헤드는 모든 OO 언어에서 가상 메소드를 호출하는 것보다 나쁘지 않습니다.
코드를 작게 만들 때 프로 시저를 다른 프로 시저로 전달하는 것이 좋습니다. 코드가 적을수록 버그가 적고 유지 관리가 쉽습니다. 여기에 예제가 있습니다. 이것은 각각 숫자 목록과 숫자 목록을 합친 두 개의 함수입니다.
그들은 연산자 +
및 -
및 해당 ID 값 (0
및 1
)를 제외하고는 동일입니다. 불행히도 많은 코드가 중복되었습니다.
연산자와 ID를 추상화하여 복잡성을 줄일 수 있습니다. 다시 작성된 코드는 다음과 같습니다.
(define fold
(lambda (proc id)
(lambda (ls)
(if (null? ls)
id
(proc (car ls) (fold (cdr ls) proc id))))))
(define sum (fold + 0))
(define product (fold * 1))
이 sum
와 product
사이의 근본적인 차이를 볼 지금 쉽다. 또한 코어 코드 개선은 한 곳에서만 이루어져야합니다. 절차 적 추상화는 멋진 도구이며 다른 절차에 절차를 전달할 수 있는지에 달려 있습니다.
함수에 함수를 전달하는 또 다른 이유는 수신 함수가 유연한 작업을 수행하도록하려는 경우입니다. 예를 들어 호출 할 각 디렉토리에서 디렉토리 트리를 처리하는 재귀 함수가있는 경우 제공된 함수와 현재 디렉토리를 전달하십시오. 이 방법으로 동일한 구조를 사용하여 디렉토리를 스캔하거나 디렉토리를 복사하거나 디렉토리를 삭제할 수 있습니다. 그리고 "work"함수는 tree가 아닌 하나의 디렉토리를 처리하기에 충분히 복잡해야했습니다. 이것은 OO를 사용한 프로 시저 프로그래밍을 주로 사용합니다.이 작업, 상속, 대리인 등을 수행하는 기본 방법이 있습니다.
또 다른 매우 일반적인 예는 술어를 전달하는 곳, 즉 예.
는 (정렬>에서 투 정렬) 여기서
> 정렬하면서 적용 할 수있는 기능이다. 이것보다 큰 것을 사용하는 매우 간단한 예입니다. 목록은 숫자 여야합니다.
(정렬 (람다 (AB) (> (문자열 길이 a) (문자열 길이 b)))에서 투 정렬) 여기서
폐쇄 문자열에 비해보다 큰 않는다는 전달 길이는 목록에 문자열이 있다고 가정합니다.
이런 종류의 것들은 클로저 나 HOF가없는 언어를 그냥 빨아들입니다. 왜냐하면 모든 객체/인터페이스/유형의 말도 안되기 때문입니다.
안녕하세요. 고맙습니다. 아직 새 사용자입니다. 체크 표시를 클릭해야한다는 것을 알지 못했습니다. –