كيفية حل var خارج النطاق ضمن مكالمة settimeout

StackOverflow https://stackoverflow.com/questions/237350

  •  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) ومعرفة ما إذا كان هذا يعمل. إذا كان الأمر كذلك ، يتم تضييق المشكلة بشكل كبير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top