параметър на функция, използвана от своя страна като параметър на функцията setTimeout в javascript

function f1()
{
  c = setTimeout(f2,200);
}
function f2()
{
 //code
}

Горният код е добре. Но какво искам да попитам: мога ли да използвам някакъв аргумент във функция f2(), който се предава от извикващата среда? Това е:

 function f1(v1)
    {
      c = setTimeout(f2(v1),200);
    }
    function f2(v2)
    {
     //code
    }

валидно ли е Тъй като опитах нещо подобно, но проблемът е, че не мога да изчистя Timeout с помощта на променлива c. Не съм сигурен какво да правя.


person Parveez Ahmed    schedule 01.09.2013    source източник


Отговори (3)


Използвайте Затваряне -

function f1(v1)
{
    c = setTimeout(f2(v1), 200);
}

function f2(v2)
{
     return function () {
         // use v2 here, and put the rest of your
         // callback code here.
     }
}

По този начин ще можете да предавате толкова аргументи, колкото искате.

Тъй като декларирате c като глобална променлива (което е лошо), можете лесно да изчистите времето за изчакване, като използвате -

clearTimeout(c);

Ако все още не можете да изчистите времето за изчакване, това означава само, че продължителността е изтекла и вашето обратно извикване е задействано, или има някаква грешка някъде другаде. В такъв случай публикувайте своя код, който използвате, за да изчистите времето за изчакване.

person MD Sayem Ahmed    schedule 01.09.2013
comment
благодаря @sayem,,,,просто работи добре!!! Ще се радвам да разбера от вас защо декларирането на c като глобална променлива е лошо? - person Parveez Ahmed; 01.09.2013
comment
@rosemary: Защото, когато декларирате глобална променлива, вие претрупвате глобалното пространство от имена, т.е. всяка друга променлива със същото име се презаписва. По същия начин можете случайно да презапишете други полезни глобални променливи. За подробно обяснение, моля, вижте това. - person MD Sayem Ahmed; 01.09.2013

Можете или да използвате метода function.bind, или можете просто да обвиете извикването

function f1(v1) { 
    c = setTimeout(function() {
        f2(v1);
    }, 200); 
} 
person Woody    schedule 01.09.2013

var timeout;
// Call `f2` with all arguments that was passed to the `f1`
function f1 () {
  var args = arguments;
  timeout = setTimeout(function () { f2.apply(this, args) }, 200);
}

Или по този начин:

// Call `f2` with some params from `f1`
function f1 (v1) {
  timeout = setTimeout(function () { f2(v1) }, 200);
}

Отговор на вашия въпрос: не можахте да изчистите времето за изчакване, защото изпълнявате функция незабавно.

person Vitalii Petrychuk    schedule 01.09.2013