如何将参数传递给setTimeout中的函数

时间:2013-07-22 05:38:25

标签: javascript jquery

我有以下代码:

function fn($){
  return function(){
    innerFn = function(){
      setTimeout(show, 1000);
    };

    show = function(){
      $.alert("TEST");
    }
  }
}

但是,一秒钟之后,当运行函数show时,它表示$未定义。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

  

如何将参数传递给setTimeout

中的函数

setTimeout有一个built in mechanism用于添加参数

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

使用它。

如果你打算使用this - 你应该小心。但这是另一个问题。

答案 1 :(得分:1)

这里有很多事情要做。最重要的是你的setTimeout永远不会被调用,因为innerFn永远不会被调用。这应该可以解决问题。

function fn($){
  return function(){
    setTimeout(function(){
      $.alert("TEST");
    }, 1000);
  }
}

fn(window)(); //triggers your alert after 1000ms

答案 2 :(得分:1)

你的代码毫无意义,因为没有任何东西被称为:

function fn($){
  return function(){
    innerFn = function(){
      setTimeout(show, 1000);
    };

    show = function(){
      $.alert("TEST");
    }
  }
}

我们假设我正在调用fn传递window,然后返回一个我可以执行的函数。但是因为这个函数只包含函数声明 - 你也忘了var所以你污染了全局范围,这很糟糕 - 没有任何事情发生。

你内部至少需要一个函数调用,例如:

function fn($){
  return function(){
    var innerFn = function(){
      setTimeout(show, 1000);
    };

    var show = function(){
      $.alert("TEST");
    }

    innerFn();
  }
}

fn(window)();

这将有效。但是,它绝对是多余的。你可以拥有:

function fn($){
  return function(){
    function show(){
      $.alert("TEST");
    }

    setTimeout(show, 1000);
  }
}

获得相同的结果。但是,如果您的目标只是绑定到setTimeout的参数,则可以使用bind。您可以使用setTimeout的第3个参数,如文档所示,但似乎not supported in IE for legacy reason

因此,bind的示例如下所示:

function show() {
    this.alert('test');
}

setTimeout(show.bind(window), 1000);

另请注意,默认情况下window是全局对象,因此通常您不必这样做,只需alert即可。但是,我想这不是你的实际代码,而只是一个测试,就像警报字符串所说的那样。

如果您希望将window作为第一个参数,并且您对上下文对象this不感兴趣,则可以执行以下操作:

function show($) {
    $.alert('test');
}

setTimeout(show.bind(null, window), 1000);