web-dev-qa-db-ja.com

パラメータを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);
13
testndtv

あるいは、クロージャーを作成せずにそれを行うことができます。

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

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

ただし、IE < 10MDNによる では機能しません。

11
Maciej Krawczyk

setTimeoutがコールバックを呼び出すとき、(デフォルトでは)引数を渡しません。つまり、コールバックが呼び出されたときの引数xは未定義です。

パラメータxを削除すると、関数本体のxは未定義のパラメータを参照するのではなく、setTimeout()の呼び出しの外で定義した変数を参照します。

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

または、mustがパラメーターである場合は、setTimeoutに引数として渡すことができます(ただし、好みに合わせて名前を付けてください)。

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

これを自分で実行し、Node docsを確認しました。関数に渡される引数は、3番目(またはそれ以上)のパラメーターとしてsetTimeout呼び出しに渡されるので...

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

私のために働いた。

コードでは、console.log(x)はコールバック関数のxパラメーターを参照します。

関数のシグネチャから省略するだけで大​​丈夫です。

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

これは、関数が引数を渡さずに呼び出されるためです。つまり、xは未定義です。

xに別のパラメーターを指定して呼び出す場合は、クロージャーでラップする必要があります。

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

setTimeoutメソッドは、関数またはコードスニペットを最初の引数として取るように設計されていますが、パラメーターxを持つ無名関数を取り、引数を取らずに呼び出されたため、xを取る具体的な関数が定義されていないため、未定義であることを示しています。 。何ができるかは、最初に呼び出す関数を定義してから、それをsetTimeoutメソッドで呼び出すだけです。次のコードスニペットを参照してください。

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