كيفية حل var خارج النطاق ضمن مكالمة settimeout
-
04-07-2019 - |
سؤال
أحاول استدعاء setTimeout من داخل رد اتصال SetInterval:
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 );
كان الحل للاستخدام مع () بيان مثل SO:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
بالطبع ، هذه دورة لا نهاية لها ، لكن النقطة التي أثيرها هنا مختلفة.
أتمنى أن يساعدك هذا :)
كمسألة أفضل الممارسات ، حاول عدم استخدام السلاسل كمعلمات ل setTimeout
و setInterval
لأن ذلك سوف يستدعي eval
... قد يؤدي استخدام النموذج التالي أيضًا إلى جعل هذه المشكلة أسهل في الفهم/التصحيح:
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
قم بتشغيله في Firefox وتحقق من الأدوات | وحدة تحكم الخطأ. إذا فشل SetTimeout ، فقد يخبرك سبب وجوده هناك.
أيضا ، حاول استبدال "someFunction();"
مع "alert('hi')"
(لا Semicolon) ومعرفة ما إذا كان هذا يعمل. إذا كان الأمر كذلك ، يتم تضييق المشكلة بشكل كبير.