使用闭包优雅的为setInterval(setTimeout)传递参数
闭包的一个常见用法是在执行函数之前为要执行的函数提供参数。
例如:将函数作为 setInterval
函数的第一个参数,这在 Web 浏览器的环境下是非常常见的一种应用。
setInterval
用于有计划地执行一个函数,要执行的函数是其第一个参数,其第二个参数是以毫秒表示的执行间隔。也就是说,当在一段代码中使用 setInterval
时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数。但是,传递函数引用的同时无法为计划执行的函数提供参数。
然而,可以在代码中调用另外一个函数,由它返回一个对内部函数的引用,再把这个对内部函数对象的引用传递给 setInterval
函数。执行这个内部函数时要使用的参数在调用返回它的外部函数时传递。这样,setInterval
在执行这个内部函数时,不用传递参数,但该内部函数仍然能够访问在调用返回它的外部函数时传递的参数:
function doSomething(paramA, paramB, paramC){
/* 返回一个由函数表达式创建的匿名内部函数的引用:- */
return (function(){
/* 这个内部函数将通过 - setInterval- 执行,而且当它执行时它会读取并按照传递给外部函数的参数行事: */
paramA[paramB] = paramC;
});
}
/* 调用这个函数将返回一个在其执行环境中创建的内部函数对象的引用。传递的参数最终将作为外部函数的参数被内部函数使用。返回的对内部函数的引用被赋给一个全局变量:-*/
var functRef = doSomething(menu, "display", "none");
/* 调用 setInterval函数,将赋给变量 - functRef - 的内部函数的引用作为传递的第一个参数:- */
setInterval(functRef, 500);
这个就是闭包的典型应用了。