setTimeout呼び出し内でスコープ外のVarを解決する方法
-
04-07-2019 - |
質問
setIntervalコールバック内からsetTimeoutを呼び出そうとしています:
function callback()
{
//assign myVar
var myVar = document.getElementById("givenID");
//...
//now wait 2 secs then call some code that uses myVAr
setTimeout("myVar.innerHTML = 'TEST'", 2000);
}
setInterval("callback();", 10000);
setIntervalは期待どおりに機能しますが、setTimeout呼び出しは失敗します。問題は、スコープ内にない変数(myVar)を参照しているという事実に関連していると思います。
これを解決する最良の方法は何ですか?
解決
これは閉鎖の完璧な候補です。
setInterval(
function ()
{
var myVar = document.getElementById("givenID");
setTimeout(
function()
{
// myVar is available because the inner closure
// gets the outer closures scope
myVar.innerHTML = "Junk";
},2000);
}, 10000);
あなたの問題は範囲に関連しており、これはそれを回避します。
他のヒント
同様の問題がありました。問題は、setTimeout()を介して自分自身からメソッドを呼び出そうとしていたことです。私には役に立たなかったこのようなもの:
function myObject() {
this.egoist = function() {
setTimeout( 'this.egoist()', 200 );
}
}
myObject001 = new myObject();
myObject001.egoist();
以下も動作しませんでした:
... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );
解決策は、with()ステートメントを次のように使用することでした:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
もちろん、これは無限のサイクルですが、ここで私が述べている点は異なります。
これが役立つことを願って:)
ベストプラクティスとして、 eTimeout
を呼び出すため、 setTimeout
および setInterval
のパラメーターとして文字列を使用しないでください。 。また、次の形式を使用すると、この問題を理解/デバッグしやすくなります:
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
Firefoxで実行し、[ツール] | [エラーコンソール。 setTimeoutが失敗すると、そこに理由が表示される場合があります。
また、" someFunction();"
を" alert( 'hi')"
(セミコロンなし)に置き換えて、それが機能するかどうかを確認してください。その場合、問題は大幅に絞り込まれます。
所属していません StackOverflow