JavaScript匿名函数
所谓匿名函数就是没有命名的函数,看起来有点难以理解,其实很常见,下面举一个小例子。
这样就创建了一个匿名函数,这个function没有函数名,但可以被调用和执行,当网页加载完毕时,会执行alert()。
<script language="javascript" type="text/javascript">(function(x,y){alert(x+y)})(2,3); //显示结果为5
</script>
上面的方法仍然是创建了一个匿名函数,并使用()优先表达式强制执行函数。
JavaScript闭包(closure)
闭包其实就是利用了函数作用域和匿名函数的知识,当函数A执行结束时,一部分变量变量被B引用,被引用的变量不能释放,形成了所谓的闭包。这里有篇很好的文章,可以参考一下。
下面看一个小例子:
<script language="javascript" type="text/javascript">
function show(){
var n=3;
setTimeout(function(){alert("first:"+n);},3000); //3秒后显示first:3
alert("second:"+n); //显示second:3
}
show();
function show2(){alert("第一个函数执行结束");}
show2();
</script>
运行上面的函数后,首先alert显示"second:3",然后显示"第一个函数执行结束",3秒后显示“first:3”。
仔细看一下,函数show执行结束的时候,变量n应该被释放了,内存里也就不存在了,怎么过了3秒还能显示出"first:3"呢?闭包恰恰就在此产生了,当函数show执行结束的时候,想要释放内存里的n,但发现变量n还在被一个匿名函数引用,要在3秒后调用,根据JavaScript闭包原理,内存里的n被保留了下来,于是在三秒以后仍然可以调用n。