函数闭包
2014-02-20 15:44:22(摘自百度百科http://baike.baidu.com/link?url=Ttth11hwnCHuANYfoX2j_oAtFDHFUMFHvTgVkuDYP_yE39ODgTobd4_1zP6GQmRcXjTRftcN5veW47p_yXK7jq)
一、什么是闭包。
函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。(外部函数先被调用,返回之后又调用内部函数。比如,外部函数返回内部函数名作为返回值,这时候内部函数就称为闭包。又比如,函数内部有事件监听器,当触发某一事件时调用内部的一个函数,这时候也称这个内部函数为闭包)
当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。(怪不得不能乱用闭包,好复杂的样子)
二、怎么用闭包。
例 1:为函数引用设置延时
闭包的一个常见用法是在执行函数之前为要执行的函数提供参数。例如:将函数作为 setTimout 函数的第一个参数,这在 Web 浏览器的环境下是非常常见的一种应用。
setTimeout 用于有计划地执行一个函数(或者一串 JavaScript 代码,不是在本例中),要执行的函数是其第一个参数,其第二个参数是以毫秒表示的执行间隔。也就是说,当在一段代码中使用 setTimeout 时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数。但是,传递函数引用的同时无法为计划执行的函数提供参数。
然而,可以在代码中调用另外一个函数,由它返回一个对内部函数的引用,再把这个对内部函数对象的引用传递给 setTimeout 函数。执行这个内部函数时要使用的参数在调用返回它的外部函数时传递。这样,setTimeout 在执行这个内部函数时,不用传递参数,但该内部函数仍然能够访问在调用返回它的外部函数时传递的参数:
function callLater(paramA, paramB, paramC){ /* 返回一个由函数表达式创建的匿名内部函数的引用:- */ return (function(){ /* 这个内部函数将通过 - setTimeout - 执行, 而且当它执行时它会读取并按照传递给 外部函数的参数行事: */ paramA[paramB] = paramC; }); } ... /* 调用这个函数将返回一个在其执行环境中创建的内部函数对象的引用。 传递的参数最终将作为外部函数的参数被内部函数使用。 返回的对内部函数的引用被赋给一个全局变量:- */ var functRef = callLater(elStyle, "display", "none"); /* 调用 setTimeout 函数,将赋给变量 - functRef - 的内部函数的引用作为传递的第一个参数:- */ hideMenu=setTimeout(functRef, 500);