我有一些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);
答案 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);