Comment utiliser “setTimeout” d'invoquer l'objet lui-même
Pourquoi ne puis-je pas utiliser setTimeout
dans un objet javascript?
Message = function () {
...
...
this.messageFactory = ...
this.feedbackTag = document.getElementById('feedbackMessages');
this.addInfo = function (message) {
var info = this.messageFactory.createInfo(message); //create a div
this.feedbackTag.appendChild(info);
setTimeout('this.feedbackTag.removeChild(info)', 5000);
//why in here, it complain this.feedbacktag is undefined ??????
};
}
Merci pour Steve Solution, maintenant, il va fonctionner que si le code est comme ci-dessous...
parce que le " il " de la veille a été réellement pointant à la fonction setTimeOut, il ne peut pas rearch Message.
Message = function () {
...
...
this.messageFactory = ...
this.feedbackTag = document.getElementById('feedbackMessages');
this.addInfo = function (message) {
var info = this.messageFactory.createInfo(message); //create a div
this.feedbackTag.appendChild(info);
var _this = this;
setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000);
};
}
Mais pourquoi ne pas travailler si nous le faisons:
Message = function () {
...
...
this.messageFactory = ...
this.feedbackTag = document.getElementById('feedbackMessages');
//public function
this.addInfo = function (message) {
var info = this.messageFactory.createInfo(message); //create a div
this.feedbackTag.appendChild(info);
delayRemove(info);
};
//private function
function delayRemove(obj) {
var _this = this;
setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000);
}
}
Vous devez vous connecter pour publier un commentaire.
Essayez de remplacer cette ligne:
avec ces deux lignes:
Remarque:
Jamais passer
setTimeout
d'une chaîne, comme cela appelleeval
(que vous devez utiliser uniquement lorsque cela est nécessaire). Au lieu de cela, passersetTimeout
une fonction de référence (ce qui peut être une fonction anonyme).Enfin, vérifiez toujours que le
this
mot-clé pointe vers ce que vous pensez de points (voir http://www.alistapart.com/articles/getoutbindingsituations).Aborder La Question 2:
Je crois que pour les fonctions normales,
this
est définie à l'window
objet, indépendamment de l'endroit où elles sont déclarées. Afin de déplacer le code dans une fonction distincte de ne pas résoudre le problème._this
variable, qui est en dehors de son propre immédiate portée lexicale.Un plus net moyen est de simplement passer ce comme un argument de la fonction appelée dans le timeout:
Vous devriez vraiment passer obj comme un argument, juste pour s'assurer qu'il est dans la portée (le nombre de paramètres est illimité):
HTML5 et Node.js étendue de la
setTimeout
fonction pour accepter les paramètres qui sont passés à votre fonction de rappel. Elle est de la signature de la méthode.setTimeout(callback, delay, [param1, param2, ...])
Comme
setTimeout
n'est pas vraiment une fonction JavaScript vos résultats peuvent varier selon les navigateurs. Je ne pouvais pas trouver les détails concrets de soutien, mais comme je l'ai dit c'est dans la spec HTML5.Pour répondre à votre dernière question: "Pourquoi ne pas travailler si nous faisons cela":
Il ne fonctionne pas parce que vous êtes de passage à une variable non définie (
info
) au lieu d'une variable définie par l' (obj
). Voici le corrigé de la fonction: