以下の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);
あるいは、クロージャーを作成せずにそれを行うことができます。
function myFunction(str1, str2) {
alert(str1); //hello
alert(str2); //world
}
window.setTimeout(myFunction, 10, 'hello', 'world');
ただし、IE < 10
MDNによる では機能しません。
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);
これを自分で実行し、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);
これは、関数が引数を渡さずに呼び出されるためです。つまり、xは未定義です。
xに別のパラメーターを指定して呼び出す場合は、クロージャーでラップする必要があります。
var x = self.someAJAXResponseJSON; // x has some object value here
setTimeout((function(y){
return(function() {
console.log("setTimeout ... : " + y);
})
})(x), 1000);
setTimeoutメソッドは、関数またはコードスニペットを最初の引数として取るように設計されていますが、パラメーターxを持つ無名関数を取り、引数を取らずに呼び出されたため、xを取る具体的な関数が定義されていないため、未定義であることを示しています。 。何ができるかは、最初に呼び出す関数を定義してから、それをsetTimeoutメソッドで呼び出すだけです。次のコードスニペットを参照してください。
var x = self.someAJAXResponseJSON;
function mylog(x){
console.log("setTimeout ... : " + x);
}
setTimeOut(mylog(x),1000);