如何将变化参数传递给setTimeout

How to pass changing parameter to setTimeout?

本文关键字:setTimeout 参数传递 变化      更新时间:2023-09-26

我想将全局参数传递给setTimeout中的函数,但我希望在解释setTimeout时值保持不变:

var a=0;
setTimeout(function(){
	console.log(a);
},5000,a)
a=1;
//output is 1 and should be 0

我该如何解决这个问题?我已经在Stack Overflow上搜索了一个答案,但没有找到任何东西。

这是因为您实际上仍然在使用外部变量。只需将参数添加到函数中:

setTimeout(function (a) {
    console.log(a);
}, 5000, a);
  var a = 0;
    setTimeout(function(c) {
      console.log(c);
    }, 5000, a);
    a = 1;

您可以使用闭包方法来做与前面的答案相同的事情:

var a=0;
function func(b){
   var c = b;
   this.display = function(){
       console.log(c); 
   }
}
var functionDisplay = new func(a);
setTimeout(function(){
    functionDisplay.display();
},5000)
a=1;

这里的问题是,在setTimeout函数中,变量被引用到外部作用域的变量引用。所以你需要为setTimeout函数创建一个不同的作用域,如下所示:

        var a = 0;
        setTimeout((function(a) {
            return function() {
                console.log(a, arguments);
            }
        })(a), 5000)
        a = 1;