2009-09-09 8 views
1
jQuery.fn.testeee = function(_msg) 
{ 
    alert(_msg); 
    $(this[0]).overlay({ 
     onBeforeLoad: function() 
     { 
      alert(_msg); 
     } 
    }).load(); 
}; 
$("#popup").testeee ('test'); 
$("#popup").testeee ('another_test'); 

Cette affiche:Ayant des problèmes avec des fonctions anonymes JavaScript

  • tests
  • Test
  • another_test
  • Test

L'alerte() à l'intérieur fonction de l'anonymat asigned à onBeforeLoad continue d'afficher "test". J'essaie ceci:

jQuery.fn.testeee = function(_msg) 
{ 
    alert(_msg); 
    $(this[0]).overlay({ 
     onBeforeLoad: static_func(_msg) 
    }).load(); 
}; 
function static_func(_msg) 
{ 
    alert(_msg); 
} 
$("#popup").testeee ('test'); 
$("#popup").testeee ('another_test'); 

Et cela fonctionne très bien. Il affiche:

  • Test
  • Test
  • Test
  • Test

Tout le monde sait pourquoi peut se passer cela?

+0

Que se passe-t-il lorsque vous appelez testeee sur différents éléments? Peut-être que l'overlay n'en crée pas un nouveau s'il en existe déjà un sur l'élément? – seth

Répondre

2

Si vous créez un objet comme celui-ci:

{ 
    onBeforeLoad: static_func(_msg) 
} 

Il ne spécifie pas de fonction à appeler, au lieu qu'il appelle la fonction immédiatement et stocke la valeur de retour dans l'objet.

Pour spécifier une fonction de vous appeler utilisez uniquement le nom de la fonction:

{ 
    onBeforeLoad: static_func 
} 

Si vous voulez appeler la fonction avec un paramètre que vous vous spécifiez, vous devez créer une fermeture qui contient la variable par l'emballage dans une fonction anonyme:

{ 
    onBeforeLoad: function() { static_func(_msg) } 
} 
+0

Alors, pourquoi dans le premier exemple la fonction alert() (qui est appelée par une fonction anonyme) continue d'afficher la première valeur de _msg * test * au lieu de montrer la valeur que vous passez réellement dans les prochains appels (* another_test * dans ce cas)? –