2012-03-03 2 views
2
var f = function() { 
    // Do something useful here 
}; 

이 함수를 '관찰'하고 실행될 때 알림을받을 수있는 방법이 있습니까? 뭔가 비슷한 바인딩 jQuery에서,하지만 bind 함수 및 DOM 이벤트가 아닌?함수가 실행될 때 jQuery/Javascript가 알림을받습니다.

f.bind(function() { 
    alert('F was executed.'); 
}); 
+0

은 그래서 당신이 정말로 원하는 것은 콜백 함수입니다. – qsheets

답변

5

당신은 notifyObserver 호출하는 함수와 f를 대체 할 수있는 :

var f = function() { 
    // Do something useful here 
    notifyObserver(); 
}; 

하지만 내가 이런 뭔가를 원하는 :

이 같은 뭔가를하지 않으려는

f = (function(oldF){ 
     return function(){ 
     notifyObserver(); 
     oldF(); 
     }; 
    })(f); 

그런 식으로 (이전) f 자체를 수정할 필요가 없습니다. 물론 여기에는 bind 기능이 포함되어 있지 않습니다. 당신이 이벤트 핸들러

manager.bind('f', function(){...}); 

그리고 래퍼 함수가 더 같은

f = (function(oldF){ 
     return function(){ 
     manager.notify('f'); 
     oldF(); 
     }; 
    })(f); 

당신은 래퍼의 생성을 일반화 할 수 있습니다 보일 것이다 작성을 등록 할 수있는 아마 이것에 대한 관리자 클래스의 어떤 종류를 만들 것입니다 :

function wrap(methodToWrap, eventName){ 
    return function(){ 
     manager.notify(eventName); 
     return methodToWrap.apply(this, arguments); 
    } 
} 

(이 인수와 반환 값의 수와 함께 작동!)

그리고 다음과 같은 일을 할 :

f = wrap(f, "f"); 

참조 : http://jsfiddle.net/NBefc/2/ (업데이트, 아니 반환 값)

+0

흥미로운 솔루션 :) 어떻게 이런 식으로 사용할 수 있습니까? – gideon

+2

멋진 솔루션, Andre. 나는 f가 어떤 인수도 취하지 않는다고 가정한다고 덧붙이겠다. 그러나 [이것의 간단한 데모] (http://jsfiddle.net/NBefc/)를 위해, 나는 이런 종류의 기능으로'alert '를 대체하는 프로그램을 함께 던졌다. 또한 하나의 인수가 필요하지만 어떻게 동적으로 여러 가지를 처리할지 모르겠습니다. 데모는 console.count를 일반적인 경고 기능에 추가하기 만하면됩니다. –

+1

@JosephMarikle : 인수와 반환 값을 사용하는 데모로 예제를 업데이트했습니다. http://jsfiddle.net/NBefc/2/ –