2010-07-02 12 views
1

Je suis en train d'utiliser une fermeture (je pense que ce qu'il est ..), je voudrais simplement exécuter une fonction avec une variable locale à un moment donné à l'avenir, comme celui-ci:Utiliser une fermeture pour exécuter une fonction dans le futur?

function boo() { 
    var message = 'hello!'; 
    var grok = function() { alert(message); } 
    foo(grok); 
} 

function foo(myClosure) { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      myClosure(); 
     } 
    } 
} 

Je pourrais contourner ce problème en utilisant des variables globales et autres, mais je préférerais utiliser quelque chose comme ce qui est indiqué ci-dessus, car il semble au moins un peu plus propre. Comment (si possible) faites-vous cela?

Merci

Mise à jour ----------- --------------------

Désolé je n'étais pas clair - Je me demandais si c'est la syntaxe correcte pour la fermeture, je l'ai essayé et ça semble bien. Je vous remercie.

+1

Quel est le problème? – kennytm

+0

Cela me semble OK, autre que l'appel $ .ajax manquant des choses comme l'URL. – Pointy

Répondre

0

Est-ce ce que vous voulez?

var boo = (function() { 
    var message = 'hello!'; 
    return function() { 
     foo(function() { 
     alert(message); 
     }); 
    }; 
})(); 

function foo(myClosure) { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      myClosure(); 
     } 
    } 
} 

ou tout simplement

function boo() { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      alert('hello!'); 
      // do sth with json 
      // ... 
     } 
    }); // <- missed a paren 
} 

L'exemple est trop simple pour savoir ce que vous voulez btw.

+0

-1 salut Pointy ... :) – galambalazs

0

Sauf si vous voulez vraiment faire un appel AJAX, setTimeout peut-être plus le long des lignes de ce que vous recherchez:

function foo(myClosure) { 
    setTimeout(myClosure, 8000); // execute the supplied function after 8 seconds 
} 

Si votre question était plus le long des lignes de « Suis-je crée une fermeture correctement? ", alors oui, votre fonction boo fait la bonne chose.

1

Votre code existant semble parfaitement bien, à l'exception de ce paren manquant à la fin. Si vous cherchez à mieux comprendre le concept des fermetures, pensez-y de la façon suivante: chaque fois qu'un élément d'un langage fermé est défini, il conserve une référence à la portée locale dans laquelle il a été défini. Dans le cas de votre code, le paramètre à $ .ajax() est un objet nouvellement créé ("{timeout: 8000, etc.}"), qui contient une fonction nouvellement créée (le succès anonyme "function), qui contient une référence à une variable locale (" myClosure ") dans la même portée. Lorsque la fonction "succès" sera finalement exécutée, elle utilisera cette référence à la portée locale pour obtenir "myClosure", même si "foo()" a été exécuté il y a longtemps. L'inconvénient de ceci est que vous pouvez vous retrouver avec beaucoup de données irrécupérables bloquées dans des fermetures - les données ne seront pas libérées tant que toutes les références n'auront pas été supprimées.

Rétrospectivement, je vous ai peut-être plus que vous aidé. Désolé si c'est le cas. : \

Questions connexes