setTimeout 将自身作为参数传递

setTimeout pass itself as an argument

我想将当前超时的ID传递给它正在执行的函数。

function test(timeout){       
  console.log(timeout)
}

setTimeout(test,1000,"timeout object") //how to pass a refrence to the current timeout object or id

编辑:

您可以将超时引用存储在一个变量中,该变量将在传递的函数内部可用。

var timeoutReference = setTimeout(function(){
    console.log('do something with the timeout reference');
    console.log('timeoutReference = ',timeoutReference);
}, 1000);

var myTimeout = setTimeout(test, 1000, "timeout object")

function test(timeout) {
  console.log(myTimeout);
}

现在 myTimeout 是对您的超时的引用,您可以使用它通过 window.clearTimeout(myTimeout) 取消它或将其用于您想要的任何目的。

从技术上讲,setTimeout() 函数 returns 一个 id,将其存储在一个变量中并传递给它。

function test(timeout) {
  console.log(timeout2)
}

var timeout2 = setTimeout(test, 1000)

编辑: 根据您执行它的环境,有时您不能在声明变量之前使用它(即 ES6 Class).你必须照顾好它。

我会创建一个效用函数,然后在需要时随时使用它。

@Velimir Tchatchevsky 的答案也是最好用的。包装解决方案一定是矫枉过正了。

function setTimeoutWrapper(func, time) {
  const ref = setTimeout(() => {
    func(ref);
  }, time);
}

setTimeoutWrapper((timeoutReference) => {
    console.log('timeoutReference = ', timeoutReference);
}, 1000);


我也看不出将引用传递给函数有什么意义,因为如果你进入函数,就意味着它被调用了。所以那里不需要clearTimeout



因为矫枉过正很有趣:

function setTimeoutWrapper(func, time, ...args) {
  const ref = setTimeout(() => {
    func(ref, ...args);
  }, time);
}

setTimeoutWrapper((timeoutReference, p1, p2) => {
  console.log('timeoutReference = ', timeoutReference);
  console.log('p1 = ', p1);
  console.log('p2 = ', p2);
}, 1000, 'I am a parameter', 'second param');


一些 IIFE 而没有全局变量呢?

(() => {
  const ref = setTimeout(() => {
    console.log('timeoutReference = ', ref);
  }, 1000);
})();

console.log('Is there a global variable ?', ref);

有外部函数

function func(ref) {
  console.log('reference : ', ref);
}

(() => {
  const ref = setTimeout(() => func(ref), 1000);
})();

console.log('Is there a global variable ?', ref);

您可以通过操纵 setTimeout 调用的 test() 函数的 this 上下文来实现此目的。您希望使用对象 属性 而不是变量来传递超时引用,因为执行将异步发生。

function delay(){ 
  var obj = {};
  obj.timeout = setTimeout(test.bind(obj), 1000) 
} 
function test() { 
  console.log(this.timeout); 
} 
delay();

或者,您可以将对象作为第三个参数传递给 setTimeout 函数,如下所示:

function delay(){ 
  var obj = {};
  obj.timeout = setTimeout(test, 1000, obj) 
} 
function test(param) { 
  console.log(param.timeout); 
} 
delay();