【问题标题】:setTimeout pass itself as an argumentsetTimeout 将自身作为参数传递
【发布时间】:2018-11-08 16:29:57
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

  • 超时对象是指任何类型的对象,还是 setTimeout 函数的返回?
  • timeouts 不是对象,它们是整数 ID
  • 你到底想要什么? setTimeout 函数的引用?
  • 返回 setTimeout @GrégoryNEUT
  • 在现代浏览器和nodeJs中它们是对象,我想以任何方式传递它,即使它是一个数字@mhodges

标签: javascript settimeout


【解决方案1】:

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

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

【讨论】:

  • 一旦你在函数中就不要使用 ID 的好处;只有在使用setInterval 时,这样做才会真正有用。
  • 如果您的函数具有与超时相同的词法范围,这很好。 OP 给@VelimirTchaatchevsky 举了一个例子,但事实并非如此。我认为 OP 希望在不依赖词法范围的情况下做到这一点。
【解决方案2】:

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

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

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

【讨论】:

  • myTImeout 是一个整数,而不是一个对象。正确的语法是 clearTimeout(myTimeout)
  • 你耍了个花招,你只是将“myTimeout”声明为一个全局变量,这是一个不好的做法试试这个: function delay(){ let myTimeout = setTimeout(test, 1000, "timeout object") } 功能测试(超时) { console.log(myTimeout); } 延迟()@VelimirTchatchevsky
  • 它可能是一个对象或一个数字,反正我想引用它.. @mhodges
  • @xxyy 查看我的答案 - 有一种方法可以在不创建全局变量的情况下做到这一点。
【解决方案3】:

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

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

【讨论】:

  • @xxyy 仅供参考,这会像其他解决方案一样创建一个“全局”变量。
  • @xxyy 这不适用于您在上面评论中发布的示例。它创建了一个全局变量,你明确表示你不想要它......
【解决方案4】:

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

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

var timeout2 = setTimeout(test, 1000)

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

【讨论】:

  • @Herohtar 编辑错字
  • 这是一种不好的做法,因为您只是将“超时”声明为全局变量,而实际上并未将其作为参数传递
  • @xxyy 没有任何方法可以将其作为实际参数传递,因为您必须先将返回值分配给变量,并且该变量不能传递给 setTimeout,因为它没有'还没有被分配。唯一的解决方案是从被调用函数中引用外部变量,如此处所示。全局变量并不普遍不好,而且这里使用的变量不一定是严格的全局变量,它只需要在 setTimeout 调用的函数之外。
【解决方案5】:

您可以通过操作由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();

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多