8
votes

Variables dans une fonction de sécurité (jQuery)

J'essaie d'utiliser une déclaration de jQuery dans une fonction de sécurité, mais Je ne comprends pas ça pour travailler. J'ai essayé beaucoup de variantes, comme celui-ci (je suis en utilisant 'ceci' parce que le Settimeout est à l'intérieur d'une fonction, et Le sélecteur est mis en cache / stocké dans un objet, donc le sélecteur $): xxx

Comment dois-je écrire ceci?

Merci!


1 commentaires

Strings dans Settimeout () et Seinterval () sont obsolètes. Les fonctions doivent être utilisées à la place.


4 Réponses :


1
votes

Vous pouvez probablement faire quelque chose comme ça, si les variables que vous essayez d'utiliser sont définies à chaque étape de la boucle.

var myObj = {
  $selector: myConfigObj.$myCachedSelector
}

$.each([ myObj, mySecondObj, myThirdObj ], function(n, $selector) {
    setTimeout(function() {
        $selector.val(saveVal);
    }, 1);
});


1 commentaires

Marco, "myconfigobj. $ Mycachedselector" semble être le problème. Il retourne "indéfini". Je l'ai remplacé par une simple chaîne qui est retournée correctement ...



19
votes

Lorsque vous devez conserver le courant Ceci code> lorsque vous appelez Settimeout Utilisez cette structure: -

setTimeout((function(self) {
  return function() { $selector.val(self.savVal) };
})(this), 1);


1 commentaires

Élégant si un peu cryptique aux gens ne connaissant pas la fermeture. Sentez-vous stupide ce n'était pas la première chose qui vous a pris à l'esprit lorsque j'ai réalisé que c'est-à-dire ne pas passer des paramètres. Je plaidèle ".NET Developer" comme excuse. C'est une chose, non?



0
votes

Merci pour vos réponses.

J'utilise une fonction à l'intérieur du Settimeout maintenant. Mais j'ai découvert que le vrai problème est situé elswhere: dans la fonction de chaque fonction, j'essaie d'accéder aux propriétés de l'objet qui pointe vers des propriétés dans un objet de configuration, mais le résultat (par exemple pour cela. Sélecteur $) est "indéfini" . P>

var myObj = {
  $selector: myConfigObj.$myCachedSelector
}

$.each([ myObj, mySecondObj, myThirdObj ], function() {
    //code
});                 


0 commentaires

7
votes

anthonywjones strong> a fourni une excellente réponse, mais il y en a un autre similaire, ce qui est légèrement plus facile à écrire et à lire. Vous stockez simplement la valeur de "ceci" dans une variable locale., IE.

var storedThis = this;
setTimeout(function() { $selector.val(storedThis.savVal); }, 1);


0 commentaires