执行超时功能后是否有可能注入任何东西

时间:2018-10-04 13:48:55

标签: javascript asynchronous settimeout

例如,我们有这样的代码

DB::raw('gender')

据我所知,超时回调中的所有内容都将在所有调用堆栈函数都将被执行后执行,然后timeoutCallback才会从“队列”进入执行堆栈。

我的问题:   执行超时功能后是否有可能注入任何东西并从超时回调中获取结果? (无需等待所有执行堆栈将为空)

类似这样:

    let a = 0;
    setTimeout(()=>{a++},0);
    console.log(a);

2 个答案:

答案 0 :(得分:0)

一旦代码被发送到超时队列中,就无法将其取回。而是将代码移到处理函数中,然后将其发送到超时队列。然后,您可以将setTimeout另存为变量,稍后可以取消触发超时,然后立即运行该函数。

let a = 0
function timeoutHandler() {
  a++
  console.log("Counted to " + a)
}

var timeout = setTimeout(timeoutHandler,10000)

clearTimeout(timeout)
timeoutHandler()

答案 1 :(得分:0)

  

执行超时功能后是否有可能注入任何东西

这是一个安全性/不变性问题吗?因为您对变量a的引用是闭包的示例,可以在多个位置进行修改。

let a = 0;
setTimeout(()=>{a++},0);
console.log(a);  // 0
    
a++              //some mystery things happened (ie Closures)
    
console.log(a);  // 1

如果您要保持a不受代码其他部分的无意影响,请使用不可变标识符(即const)或使用高阶函数传递递增的值。