闭包可被利用的常见场景
场景一:采用函数引用方式的 setTimeout 调用
闭包的一个通常的用法是为一个在某一函数执行前先执行的函数提供参数。例如,
在 web 环境中,一个函数作为 setTimeout 函数调用的第一个参数,是一种很常
见的应用。
setTimeout 将要执行的函数(或者一段 JavaScript 代码,但这不是我们要讨论
的情况)作为它的第一个参数,下一个参数是需要延迟执行的时间。如果一段代码
想通过 setTimeout 来调用,那么它需要传递一个函数对象的引用来作为第一个参
数。延迟的毫秒数作为第二个参数,但这个函数对象的引用无法为将要被延迟执行
的对象提供参数。
但是,可以调用另一个函数来返回一个内部函数的调用,将那个内部函数对象的引
用传递给 setTimeout 函数。内部函数执行时需要的参数,在调用外部函数时传递
给它。setTimeout 在执行内部函数时无需传递参数,因为内部函数仍然能够访问
外部函数调用时提供的参数:
[javascript]view plaincopy
print?
1. functioncallLater(paramA,paramB,paramC){
2. /*使用函数表达式创建并放回一个匿名内部函数的引用*/
3. return(function(){
4. /*
5. 这个内部函数将被 setTimeout 函数执行;m
6. 并且当它被执行时,m
7. 它能够访问并操作外部函数传递过来的参数m
8. */
9. paramA[paramB]=paramC;
10. });
11. }
12.
13. /*
14. 调用这个函数将在它的执行上下文中创建,并最终返回内部函数对象的引用m
15. 传递过来的参数,内部函数在最终被执行时,将使用外部函数的参数m
16. 返回的引用被赋予了一个变量m
17. */
18. varfuncRef=callLater(elStyle,"display","none");
19. /*调用 setTimeout 函数,传递内部函数的引用作为第一个参数*/
20. hideMenu=setTimeout(funcRef,500);