将参数传递给setTimeout回调函数

时间:2015-09-01 08:15:23

标签: javascript jquery settimeout

我有一些JS代码如下;

var x = self.someAJAXResponseJSON; // x has some object value here
setTimeout(function(x){
    console.log("setTimeout ... : " + x); // But x is undefined here
}, 1000);

所以我想将“x”传递给setTimeout回调函数。但是我在setTimeout中得到了未定义的“x”。

我做错了什么?

已更新

使用DOJO JS解决类似问题的任何想法

setTimeout(dojo.hitch(this, function(){
    this.executeSomeFunction(x); // what shud be this
    console.log("setTimeout ... : " + x); // But x is undefined here
}), 1000);

6 个答案:

答案 0 :(得分:11)

或者你可以在不创建闭包的情况下完成。

function myFunction(str1, str2) {
  alert(str1); //hello
  alert(str2); //world
}

window.setTimeout(myFunction, 10, 'hello', 'world');

但请注意,它不适用于IE < 10 according to MDN

答案 1 :(得分:6)

setTimeout调用回调时,它不会传递任何参数(默认情况下);也就是说,在调用回调时,参数x是未定义的。

如果删除参数x,函数体中的x将不会引用未定义的参数,而是引用您在setTimeout()调用之外定义的变量。

var x = "hello";
setTimeout(function () { //note: no 'x' parameter
    console.log("setTimeout ... : " + x);
}, 1000);

或者,如果必须是一个参数,你可以将它作为一个参数传递给setTimeout(尽管你自己帮个忙,但是不同地命名它):

var x = "hello";
setTimeout(function (y) {
    console.log("setTimeout ... : " + y);
}, 1000, x);

答案 2 :(得分:2)

在您的代码中,console.log(x)引用回调函数的x参数。

从功能签名中省略它,你就可以了:

setTimeout(function(){
  console.log("setTimeout ... : " + x); // now x is the global x
}, 1000);

答案 3 :(得分:2)

自己进入并观察Node文档,传递给函数的参数作为setTimeout调用的第3个(或更多)参数进入,所以...

myfunc = function(x){console.log(x)};
x = "test";
setTimeout(myfunc,100,x);

为我工作。

答案 4 :(得分:1)

这是因为函数被调用时没有传递任何参数:所以 x 是未定义的。

如果您愿意使用 x 的不同参数调用它,则应将其包装在闭包中:

var x = self.someAJAXResponseJSON; // x has some object value here
setTimeout((function(y){
    return(function() {
        console.log("setTimeout ... : " + y);
    })
})(x), 1000);

答案 5 :(得分:1)

setTimeout方法旨在将函数或代码片段作为其第一个参数,但在您的情况下,您使用了带参数x的匿名函数,并且在不带任何参数的情况下调用它,因此它显示未定义,因为没有定义具体函数需要x。你可以做的是你可以先定义你想要调用的函数,然后在setTimeout方法中调用它。请参阅以下代码段:

var x = self.someAJAXResponseJSON;
function mylog(x){
  console.log("setTimeout ... : " + x);
}
setTimeOut(mylog(x),1000);