带参数的setTimeout

Men*_*ual 13 javascript

试图解决这个问题时有点头疼.我想要做的是有一个带有参数自定义的setTimeout 与出不必创建一个函数来传递.让我用代码解释一下:

想避免:

function makeTimeout(serial){
  serial.close();
}

setTimeout(makeTimeout(sp.name), 250);
Run Code Online (Sandbox Code Playgroud)

我想要做的就是以某种方式通过以下方式调用1个班轮:

setTimeout(function(arg1){ .... }(argument_value), 250);
Run Code Online (Sandbox Code Playgroud)

可以这样做,还是只能通过无参数函数?

Joã*_*lva 23

您可以传递一个匿名函数,makeTimeout该函数使用给定的参数进行调用:

setTimeout(function () {
  makeTimeout(sp.name);
}, 250);
Run Code Online (Sandbox Code Playgroud)

还有另一种选择,使用bind:

setTimeout(makeTimeout.bind(this, sp.name), 250);
Run Code Online (Sandbox Code Playgroud)

但是,此功能是ECMAScript第5版功能,尚未在所有主流浏览器中支持.为了兼容性,您可以包含MDN提供bind源代码,允许您在本机不支持它的浏览器中使用它.

演示.

  • 应该注意的是,调用函数时传递给`makeTimeout`的值将是`sp.name`的值,这可能与调用`setTImeout`时的值不同. (4认同)

Rob*_*obG 7

如果不想声明单独的函数,可以使用立即调用的函数表达式和闭包,例如

// Parameter to use
var bar = 'bar';

// Function to call
function foo(arg) {
  alert(arg);
}

// Go…
setTimeout(
  (function(arg1){
    return function(){
      foo(arg1);
    };
  }(bar)), 2000);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用函数构造函数:

setTimeout( Function('foo(bar)'), 2000);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用字符串:

setTimeout('foo(bar)', 1000);
Run Code Online (Sandbox Code Playgroud)

这本质上是一样的。现在等待“但那就像使用 eval 一样,每个人都知道 eval 是邪恶的并且是一个巨大的安全漏洞——你所有的长子都注定要失败!

但严重的是,eval(和 Function 构造函数)效率低下,可能导致惰性编程,因此请使用另一个选项,例如上面的第一个。