2010-09-28 10 views
3

Comment revient-on d'une fermeture, sans retour de la fonction contenant?Retour de la fermeture?

Dans la fonction suivante, l'instruction return renvoie en réalité GM_xmlhttpRequest: pas la fermeture. Naturellement je peux voir que je pourrais arranger mon code de sorte que cette exécution tombe la fin de la fermeture, mais je suis curieux de savoir comment revenir tôt dans l'exemple.

function GM_xmlhttpRequest(details, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState != 4) 
     return; // <-- zomg returns from parent function wtf 
    if (xhr.status != 200) 
     callback(null); 
    callback(xhr); 
    } 
    xhr.open('GET', details.url, true); 
    xhr.send(); 
}; 
+2

Il n'y a pas de solution, à moins que l'analyseur rencontre des problèmes en raison de caractères ignorés ('{', ';', etc)). vous savez que 'GM_xmlhttpRequest' va s'exécuter et se terminer dès qu'il est appelé, n'est-ce pas? – lincolnk

Répondre

2

retour ne jamais quitter le callee (fonction actuelle) et rendre le contrôle à l'appelant (appelant la fonction « parent »), il ne sera jamais le retour de l'appelant . Dans la situation que vous décrivez, le callee est la fonction anonyme définie sur onreadystatechange et il n'y a pas d'appelant (en soi).

GM_xmlhttpRequest retours non défini après la ligne xhr.send() avant que la fonction onreadystatechange soit exécutée, car il n'y a pas retour déclaration et XHR est asynchrone. La ligne "zomg wtf" quittera simplement cette fonction anonyme puisqu'il n'y a aucun appelant pour renvoyer le contrôle à.

De ECMA-262, 3e et 5e éditions (section 12.9 La déclaration de retour):

Une déclaration de retour provoque une fonction de cesser l'exécution et renvoyer une valeur à l'appelant . Si L'expression est omise, la valeur renvoyée est indéfinie. Sinon, la valeur renvoyée est la valeur Expression.

+0

Si vous réglez la fermeture sans utiliser de retour, la fermeture est appelée plusieurs fois avec des valeurs 'readyState' différentes. Le retour explicite met prématurément fin à la fonction et aucun appel n'est effectué. –