параметр функции, используемый, в свою очередь, как параметр функции setTimeout в javascript

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

Приведенный выше код просто прекрасен. Но что я хочу спросить: могу ли я использовать какой-либо аргумент в функции f2(), который передается из вызывающей среды? То есть:

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

Это действительно? Потому что я пробовал что-то подобное, но проблема в том, что я не могу очистить время ожидания с помощью переменной 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