所以我有一个循环执行函数的函数,例如:
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 。
但无论如何,如何“传递”变量而不改变其范围。
答案 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)
如果您希望使用不带参数的函数,可以考虑使用call
或apply
方法:
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方法。