javascript - Funktion anropad händelse i JS?


Är det möjligt att binda en funktion till en annan funktion vid anrop? Så till exempel skulle det gå till ungefär så här:

function a(){...}
function b(){...}
b.bind("onInvoke","a");

Så när b anropas, anropas också a automatiskt.

REDIGERA: OK OK, för att klargöra, detta är inte en fråga om kedjning. Idén är att hitta ett elegant sätt att göra händelsebindning. Observera det normala "oiniativa" sättet med normal funktions-återuppringning:

function handler(){...}
function caller1(){handler(); ...}
function caller2(){handler(); ...}
function caller2(){handler(); ...}
// More callers all over your website everywhere else

Det fungerar, eller hur? Men vad händer om jag har samtal överallt? Det är svårt att organisera eller ändra saker.

Observera nu den överlägsna lösningen! (Om en finns)

function handler(){...}
// Caller make no reference to handler on creation
function caller1(){...}
function caller2(){...}
function caller3(){...}
// Caller function are still all over the place, all over your website
// Event handler registered later in one location here, doesn't matter where they are phsically
caller1.bind("onInvoke",handler);
caller2.bind("onInvoke",handler);
caller3.bind("onInvoke",handler);

Så väldigt mycket som din vanliga HTML - JQuery-händelseregistrering. Du skriver inte onClick på varje bild som användaren kan klicka på (som finns överallt), det skulle vara alldeles för besvärligt att organisera det! Du skriver bara en enkel

 $("img").bind("onClick",click_handler);

för hela din webbplats. Detta är kärnan i vad jag letar efter, förutom JS-funktioner.

Jag hoppas att det klargör saker.

REDIGERA 2: Behöver fungera med IE7!!! JavaScript 1.8.5 är bra och allt, men inget stöder det just nu.

Svar #1

Du kan göra det med en aspektorienterad metod. Här är ett enkelt exempel:

Bifoga anropet till a() till funktionen b():

var _b = b;
b = function(){
   _b();
   a();
}

Anropa nu b():

b();

Se det i aktion här: http://jsfiddle.net/eZ9wJ/

Svar #2

Det finns olika lösningar beroende på hur mycket du vill designa. Ett enkelt och flexibelt tillvägagångssätt är att skapa en kedjande hjälpfunktion:

function chain() {
   var args = arguments;
   return function() {
      // loop through arguments and invoke all functions
      for(var i = 0; i < args.length; i++) {
         if(typeof args[i] == "function")
            args[i]();
      }
   }
}

Det här gör är att returnera en ny funktion som kommer att kalla på de angivna funktionerna i följd. Använd den så här:

var myChain = chain(b, a);
myChain();