setTimeout将自身作为参数传递

时间:2018-11-08 16:29:57

标签: javascript settimeout

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

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

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

编辑:

  • 超时可能是一个对象(ES6)或一个数字,无论如何我都想引用它
  • 我不想将超时声明为全局变量,我只是想将其作为参数传递

5 个答案:

答案 0 :(得分:3)

我将创建一个实用程序函数,然后在需要时使用它。

@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);

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

var timeout2 = setTimeout(test, 1000)

编辑: 根据所执行的环境,有时您不能在声明变量之前使用变量(即ES6类)。您必须要照顾好这一点。

答案 4 :(得分:1)

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

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();

相关问题