2009-12-06 3 views
3

좋아요, 그래서 다른 함수에 함수를 전달할 수 있습니다. Passing a function to another function in Actionscript 3함수를 함수에 전달하는 것이 언제 의미가 있습니까?

이것은 분명 강력합니다. 그러나 더 중요한 질문은 언제 다른 기능을 호출 할 때마다 성능 오버 헤드가 발생합니까?

+1

안녕하세요. 고맙습니다. 아직 새 사용자입니다. 체크 표시를 클릭해야한다는 것을 알지 못했습니다. –

답변

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

1 예는 자바 스크립트 AJAX 호출

namespace.class.method(parm1, parm2, callback,onErr); 

하는 서버에 asynchrously 실행하고,이 완료되면이있다

function callback(result) { 
     $('#myDiv').innerHTML = result; 
} 

전달되는 콜백 메소드를 실행하는 방법 예를 들어 이벤트 처리를 살펴보십시오.

4

당신은 아마 하나를 사용 예기치 않게 이런 모든 시간을

이 호출 실제로 함수가 그것으로 전달 될 필요 EventDispatcher 클래스의 또는 addEventListener : useCapture를 기능 : :

하여 addEventListener (유형 : 문자열, 청취자 부울 = 거짓, 우선 순위 : INT = 0,의 useWeakReference :) = 거짓 부울 : 보이드 주변 기능을 전달

http://livedocs.adobe.com/flex/3/langref/flash/events/EventDispatcher.html

많이의 대체를위한 사용 콜백. 다른 많은 용도가 있지만보다 간단한 시나리오 중 하나를 강조합니다.

4

성능 오버 헤드는 모든 OO 언어에서 가상 메소드를 호출하는 것보다 나쁘지 않습니다.

코드를 작게 만들 때 프로 시저를 다른 프로 시저로 전달하는 것이 좋습니다. 코드가 적을수록 버그가 적고 유지 관리가 쉽습니다. 여기에 예제가 있습니다. 이것은 각각 숫자 목록과 숫자 목록을 합친 두 개의 함수입니다.

그들은 연산자 +- 및 해당 ID 값 (01)를 제외하고는 동일입니다. 불행히도 많은 코드가 중복되었습니다.

연산자와 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)) 

sumproduct 사이의 근본적인 차이를 볼 지금 쉽다. 또한 코어 코드 개선은 한 곳에서만 이루어져야합니다. 절차 적 추상화는 멋진 도구이며 다른 절차에 절차를 전달할 수 있는지에 달려 있습니다.

1

함수에 함수를 전달하는 또 다른 이유는 수신 함수가 유연한 작업을 수행하도록하려는 경우입니다. 예를 들어 호출 할 각 디렉토리에서 디렉토리 트리를 처리하는 재귀 함수가있는 경우 제공된 함수와 현재 디렉토리를 전달하십시오. 이 방법으로 동일한 구조를 사용하여 디렉토리를 스캔하거나 디렉토리를 복사하거나 디렉토리를 삭제할 수 있습니다. 그리고 "work"함수는 tree가 아닌 하나의 디렉토리를 처리하기에 충분히 복잡해야했습니다. 이것은 OO를 사용한 프로 시저 프로그래밍을 주로 사용합니다.이 작업, 상속, 대리인 등을 수행하는 기본 방법이 있습니다.

0

또 다른 매우 일반적인 예는 술어를 전달하는 곳, 즉 예.

는 (정렬>에서 투 정렬) 여기서

> 정렬하면서 적용 할 수있는 기능이다. 이것보다 큰 것을 사용하는 매우 간단한 예입니다. 목록은 숫자 여야합니다.

(정렬 (람다 (AB) (> (문자열 길이 a) (문자열 길이 b)))에서 투 정렬) 여기서

폐쇄 문자열에 비해보다 큰 않는다는 전달 길이는 목록에 문자열이 있다고 가정합니다.

이런 종류의 것들은 클로저 나 HOF가없는 언어를 그냥 빨아들입니다. 왜냐하면 모든 객체/인터페이스/유형의 말도 안되기 때문입니다.

관련 문제