场景一:采用函数引用方式的setTimeout调用
闭包的一个通常的用法是为一个在某一函数执行前先执行的函数提供参数。例如,在web环境中,一个函数作为setTimeout函数调用的第一个参数,是一种很常见的应用。
setTimeout将要执行的函数(或者一段javascript代码,但这不是我们要讨论的情况)作为它的第一个参数,下一个参数是需要延迟执行的时间。如果一段代码想通过setTimeout来调用,那么它需要传递一个函数对象的引用来作为第一个参数。延迟的毫秒数作为第二个参数,但这个函数对象的引用无法为将要被延迟执行的对象提供参数。
但是,可以调用另一个函数来返回一个内部函数的调用,将那个内部函数对象的引用传递给setTimeout函数。内部函数执行时需要的参数,在调用外部函数时传递给它。setTimeout在执行内部函数时无需传递参数,因为内部函数仍然能够访问外部函数调用时提供的参数:
function callLater(paramA, paramB, paramC) { /*使用函数表达式创建并放回一个匿名内部函数的引用*/ return (function () { /* 这个内部函数将被setTimeout函数执行; 并且当它被执行时, 它能够访问并操作外部函数传递过来的参数 */ paramA[paramB] = paramC; }); } /* 调用这个函数将在它的执行上下文中创建,并最终返回内部函数对象的引用 传递过来的参数,内部函数在最终被执行时,将使用外部函数的参数 返回的引用被赋予了一个变量 */ var funcRef = callLater(elStyle, "display", "none"); /*调用setTimeout函数,传递内部函数的引用作为第一个参数*/ hideMenu = setTimeout(funcRef, 500);
场景一.1:
var foo = ( function() { var secret = 'secret'; // “闭包”内的函数可以访问 secret 变量,而 secret 变量对于外部却是隐藏的 return { get_secret: function () { // 通过定义的接口来访问 secret return secret; }, new_secret: function ( new_secret ) { // 通过定义的接口来修改 secret secret = new_secret; } }; } () ); foo.get_secret (); // 得到 'secret' foo.secret; // Type error,访问不能 foo.new_secret ('a new secret'); // 通过函数接口,我们访问并修改了 secret 变量 foo.get_secret (); // 得到 'a new secret'
原网址链接:http://blog.csdn.net/yanghua_kobe/article/details/6780181