JavaScript:使用setInterval()将变量从一个函数传递到另一个函数?

时间:2010-12-08 00:14:54

标签: javascript function variables

所以我有一个循环执行函数的函数,例如:

function(f){
  var variable;
  for(z = 0; z < 10; z++){
    variable = "cool";         
    setInterval(f)
  }
是的,真正的功能比这复杂得多,但它是相同的理论。 我希望能够在参数 f 中执行函数并设置一些变量(例如变量)以便这个函数可以使用它们,总的来说这就是想法:

function say(f){
   var variable = "hey";
   setInterval(f);
}
say(function(){
   alert(variable)
});

在这里,应该有一个警告框说。这就是理论,但它不会起作用:

  

未定义变量“变量”

浏览器可能会忽略错误并提醒 undefined

但无论如何,如何“传递”变量而不改变其范围

4 个答案:

答案 0 :(得分:7)

JavaScript已closures,因此可以执行此操作:

var x = 0;
setInterval(function() {
   //do something with x
}, 1000);

在您的具体情况下,您应该这样做:

function say(f){
   var variable = "hey";
   setInterval(function() { 
       f(variable); //invoke the say function's passed-in "f" function, passing in "hey"
   }, 1000);
}
say(function(arg){
    //arg will be "hey"
    alert(arg);
});

setInterval使用两个参数,第二个是您希望延迟执行传入函数引用的时间量(以毫秒为单位)。

答案 1 :(得分:3)

如果您希望使用不带参数的函数,可以考虑使用callapply方法:

function say(f){
   var variable = "hey";
   setInterval(function() { 
       f.call(variable); // set the context
   }, 1000);
}
say(function(){
    alert(this);
});

答案 2 :(得分:1)

鉴于lambda函数来自另一个作用域,您不能使用闭包直接获取函数中的值。你必须通过一个闭包直接将值传递给你的函数,并准备好在lambda中接收它:

function say(f){
   var variable = "hey";
   setInterval( function(){ f(variable) }, 500 );
}
say(function(yyy){
   alert(yyy);
});

答案 3 :(得分:1)

function say(f){
  var variable = "hey";
  setInterval(function(){
    f.call(null, variable);
  }, 1000);
}
say(function(variable){
   alert(variable)
});

在函数上使用call方法。