J'ai du code JS comme ci-dessous;
var x = self.someAJAXResponseJSON; // x has some object value here
setTimeout(function(x){
console.log("setTimeout ... : " + x); // But x is undefined here
}, 1000);
Je veux donc passer "x" à la fonction de rappel setTimeout. Mais je reçois "x" comme indéfini dans le setTimeout.
Qu'est-ce que je fais mal ?
ACTUALISÉ
Toute idée de correction pour un problème similaire à l'aide de DOJO JS
setTimeout(dojo.hitch(this, function(){
this.executeSomeFunction(x); // what shud be this
console.log("setTimeout ... : " + x); // But x is undefined here
}), 1000);
Vous pouvez également le faire sans créer de fermeture.
function myFunction(str1, str2) {
alert(str1); //hello
alert(str2); //world
}
window.setTimeout(myFunction, 10, 'hello', 'world');
Mais notez que cela ne fonctionne pas sur IE < 10
selon MDN .
Lorsque setTimeout
appelle le rappel, il ne passe aucun argument (par défaut); c'est-à-dire que l'argument x
n'est pas défini lorsque le rappel est invoqué.
Si vous supprimez le paramètre x
, x
dans le corps de la fonction ne fera pas référence au paramètre non défini mais à la variable que vous avez définie en dehors de l'appel à setTimeout()
.
var x = "hello";
setTimeout(function () { //note: no 'x' parameter
console.log("setTimeout ... : " + x);
}, 1000);
Alternativement, si ce doit être un paramètre, vous pouvez le passer comme argument à setTimeout
(faites-vous une faveur et nommez-le différemment, cependant):
var x = "hello";
setTimeout(function (y) {
console.log("setTimeout ... : " + y);
}, 1000, x);
Ran dedans moi-même et regardé les Node docs, les arguments à passer dans la fonction entrent en tant que 3ème (ou plus) paramètre à l'appel setTimeout donc ...
myfunc = function(x){console.log(x)};
x = "test";
setTimeout(myfunc,100,x);
A travaillé pour moi.
Dans votre code, console.log(x)
fait référence au paramètre x
de la fonction de rappel.
Omettez-le simplement de la signature de la fonction et tout ira bien:
setTimeout(function(){
console.log("setTimeout ... : " + x); // now x is the global x
}, 1000);
C'est parce que la fonction est appelée sans lui passer d'argument: donc x n'est pas défini.
Vous devriez l'envelopper dans une fermeture si vous êtes prêt à l'appeler avec différents paramètres pour x:
var x = self.someAJAXResponseJSON; // x has some object value here
setTimeout((function(y){
return(function() {
console.log("setTimeout ... : " + y);
})
})(x), 1000);
la méthode setTimeout est conçue pour prendre la fonction ou l'extrait de code comme premier argument, mais dans votre cas, vous avez pris une fonction anonyme avec le paramètre x et qui est appelée sans prendre d'argument, donc elle est indéfinie car aucune fonction concrète définie ne prend x . Ce que vous pouvez faire, c'est que vous pouvez d'abord définir la fonction que vous souhaitez appeler, puis l'appeler simplement dans la méthode setTimeout. Voir l'extrait de code suivant:
var x = self.someAJAXResponseJSON;
function mylog(x){
console.log("setTimeout ... : " + x);
}
setTimeOut(mylog(x),1000);