2010-01-09 4 views
0

Je ne sais pas pourquoi mais ce code ne fonctionne pas? Pourquoi pas? Je suppose que c'est parce que le problème de portée que j'ai ici:Problème d'étendue avec SetTimeOut

function washAway(obj) { 
    alert($(obj)); // says HTML Object which is fine 
    setTimeout(function() { 
     alert($(obj)); // says undefined 
     $(obj).fadeOut("slow", function() {    
      $(this).remove(); 
     }); 
    }, 2000); 
}; 
+0

son travail pour moi .. – Nakul

+0

@Nakul: parce que votre 'obj 'est global et ne change pas entre-temps, contrairement à Aaron. – Tomalak

Répondre

3

Au moment où la fonction du délai d'attente s'exécute, il n'a aucun moyen de savoir ce qu'est obj - c'est un paramètre passé dans la méthode où le timeout a été configuré, mais la fonction inside ne fait aucune référence.

Une autre approche est d'écrire un plugin jQuery attendre avant d'agir comme ceci:

function($){ //to protect $ from noConflict() 
    $.fn.pause = function(duration) { 
     $(this).animate({ dummy: 1 }, duration); 
     return this; 
    }; 
} 

Ensuite, vous pouvez utiliser:

$(obj).pause(2000).fadeOut("slow", function() { $(this).remove(); }); 
+0

Oui, vous avez également raison. Merci pour l'exemple de code btw. – Tarik

1

De toute façon, j'ai trouvé ma réponse après quelques essais/faux. Mais je me demande toujours pourquoi cela n'a pas fonctionné.

Voici le code:

function washAway(obj) { 
    alert($(obj).attr("id")); 
    var a = function() { 
     var _obj = obj; 
     return function() { 
      $(_obj).fadeOut("slow", function() { 
       $(this).remove(); 
      }); 
     }; 
    }; 

    setTimeout(a(), 2000); 
}; 

Edit: Je crois avoir compris le problème ici:

Parce que nous parlons de fermetures ici, quand se termine l'exécution Washaway, la variable obj est détruite La fonction callback de la fonction setTimeOut ne peut donc pas utiliser cette ressource car elle n'est plus disponible sur la pile et n'est pas non plus une variable globale.