2010-09-04 7 views
4

Homme Je cherche à comprendre les fonctions de rappel. J'ai été sur de nombreux articles et messages ici sur SO. Les explications semblent circulaires et je pense que je m'éloigne de la compréhension lol. Je les ai utilisés apparemment dans des événements javascript, mais c'est plus un «mémoriser ces lignes» que «c'est ce qui se passe et pourquoi» sorte de compréhension.Fonctions de rappel

Donc voici ma compréhension.

Dites que vous avez 2 objets, la fonction p() et la fonction k(). Vous passez la fonction k à p(). p() peut alors accéder aux variables internes de k.

function p(x){ 
    alert(x.n);//5 
} 

function k(){ 
    this.n = 5; 
} 

p(k); 

Embarrassant combien de temps il m'a pris pour obtenir cela.

+3

Quelle est votre question? – BoltClock

+1

Je pense que vous pourriez confondre les rappels avec des fermetures –

+1

great ... wtf est une fermeture ... fml lol, srsly besoin d'aller au lit maintenant – jason

Répondre

4

Peut-être qu'un exemple vous aidera?

// First, lets declare the function we're going to call 
calledFunction = function (callback, arg) { 
    callback(arg); 
}; 
// Second, lets declare the callback function 
callbackFunction = function (arg) { 
    alert(arg); 
}; 
// Next, lets do a function call! 
calledFunction(callbackFunction, "HAI"); 

Ainsi, l » argument callbackcalledFunction() est callbackFunction mais, si vous remarquez, nous ne réclamons pas la fonction encore, nous transmettons une variable la contient la fonction, et sa fonction arg est juste quelque chose à alert(). Lorsque calledFunction() est exécuté, il prend tout ce qui a été passé comme argument callback et l'appelle arg comme premier argument, et seul.

Aidé?

Modifier: Cela fonctionne toujours si vous utilisez des déclarations de style function foo() {}. (juste au cas où, je ne sais pas comment vous êtes avec JavaScript)

-1

Vous le faites mal. this.n = 5; dans k() ne définit pas sa "variable interne" et x.n accède à la propriété x de l'objet fonction, au lieu de sa variable interne. Essayez ceci:

function p(x) { alert(new x().n); }

variable de liaison est un concept de programmation importante.

Je pense que cet article aide. http://www.hunlock.com/blogs/Functional_Javascript

+0

donc quand x() est appelé, (qui est juste k se faisant passer pour x), n est toujours dans la portée. Est-ce le point? – jason

+0

@John ouais, juste couru que, n n'est pas défini – jason

+0

et le ce mot-clé est l'objet fenêtre dans les deux fonctions, même à l'intérieur de x() – jason