2010-11-04 12 views
1

J'ai ce codeJquery, variable d'accès de la fonction

function getSelectData(id) { 
    jQuery(id).change(function() { 
     var value=''; 
     jQuery(id+" option:selected").each(function() { 
      value =jQuery(this).val() ; 
     }); 
     console.log(value); 
    }); 
    return value; 
} 

var d = getSelectData("#sort_post_date"); 
console.log(d); 

Comment je peux accéder à la "valeur" variable i essayé différentes méthodes, mais rien, où est console.log (valeur); , sortie de valeur, mais en dehors de rien, merci de votre aide!

Répondre

9

Vous avez besoin ot valeur de déplacement en dehors de la fonction de sorte qu'il est lié à la fermeture. Comme ceci:

function getSelectData(id) { 
    var value=''; 

    // set value to be the current selected value 
    value = jQuery(id+" option:selected").val(); 

    // change value whenever the box changes 
    jQuery(id).change(function() { 
     value = jQuery(id+" option:selected").val(); 
     console.log("I see a change! -> "+value); 
    }); 

    console.log(value); 
    return value; 
} 

var d = getSelectData("#sort_post_date"); 
console.log(d); 

est ici le violon de montrer cela fonctionne: http://jsfiddle.net/ZvuMh/

+0

Merci de votre aide !! J'apprécie vraiment cela ! j'essaye cette méthode mais est toujours vide, je peux obtenir juste voir la valeur où est "console.log (valeur);" , le changement de fonction extérieur ne fonctionne pas :(, l'extérieur est vide – mIRU

+1

donc le 'console.log (valeur);' montre la valeur correcte mais le 'console.log (d);' ne le fait pas? – Hogan

+0

'console.log (valeur); 'affiche la valeur correcte, mais' console.log (d); 'est vide – mIRU

1

Il s'agit d'une question de clôture classique. Voici quelques-unes des plus semblables

Event handlers inside a Javascript loop - need a closure?

javascript timer or intervals created in loop using closure

Javascript closure inside loops - simple practical example

Bottom line, la variable value est pas de gestionnaire local pour les évènements que vous créez. Donc tous les des gestionnaires que vous créez vont avoir la valeur que value avait lorsque la fonction externe s'est terminée. Dans ce cas, il est toujours vide.

+0

il doit y avoir un million d'em. – Hogan

0

Vous ne pouvez pas accéder à votre variable de valeur en dehors de la fonction dans laquelle elle a été déclarée. C'est ce qu'on appelle la variable variable. Lire la portée des variables here

Si vous voulez être en mesure d'accéder à une variable, vous devez être dans un champ qui est au moins aussi général que celui qu'il a été déclaré dans.

Donc dans ce cas :

function getSelectData(id){ 
    var value='';   
    jQuery(id).change(function() { 
     jQuery(id+" option:selected").each(function() { 
      value =jQuery(this).val() ; 
     }); 

     console.log(value); 
    }); 
    return value; 
} 

var d=getSelectData("#sort_post_date"); 
console.log(d); 
+1

Vous n'utilisez pas une fermeture mieux? – Hogan

+0

Je suis d'accord - apprendre à utiliser les fermetures ici va changer la façon dont vous écrivez JavaScript pour toujours. – hybernaut

+0

@Hogan: Certainement, n'avait pas lu mon code correctement. Bien que vous ayez encore besoin de connaître la portée variable avant de pouvoir comprendre la fermeture. –

0

Essayez definining la variable de valeur dans la portée globale:

var value=''; 

function getSelectData(id) { 
    jQuery(id).change(function() { 
     value=''; 
     jQuery(id+" option:selected").each(function() { 
      value =jQuery(this).val() ; 
     }); 
    console.log(value); 
    }); 
    return value; 
} 

Il y a aussi inutile de revenir « valeur » ici, puisqu'il est placé dans un gestionnaire d'événement ... il n'y aura rien là-dedans (ou, juste une ancienne valeur) au point de retour.

+0

Il y a un point. En utilisant une fermeture, vous pouvez réduire la "paillette" dans la portée globale. Voir mon exemple de code. – Hogan

+0

Je ne vois pas comment c'est une fermeture. Vous ne renvoyez pas une fonction, vous renvoyez simplement une var contenant une chaîne. Si vous voulez que chaque gestionnaire de changement garde une trace de sa propre valeur précédente, pourquoi ne pas simplement le définir dans la fonction gestionnaire, et appeler une méthode de rappel à partir de là? Eh bien, je suppose que le gestionnaire se ferme autour de la valeur var, de sorte que s'il y a des tonnes de gestionnaires, il n'y a qu'un val suivi à la fois? Est-ce le but de ceci? La valeur retournée par getSelectData ne semble toujours pas utile. – jmans

+0

C'est une fermeture car 'function() {value = ''; jQuery (id + "option: selected"). each (function() {value = jQuery (this) .val();} 'inclut une référence à la variable' value'. 'value' est inclus dans la fermeture de la fonction – Hogan