小知识点共勉一下,以便打发无聊的下雨天。。。。
沿袭一向的简单粗暴风格,先来段javascript代码:
function parent()
{
var i=100;
function child()
{
alert("读取父函数局部变量i="+i);//获取成功,值为100
}
}
事实说明,子函数能向上读取其父函数的局部变量。然这并不奇怪,因为Javascript语言具有的"链式作用域"结构(chain scope),子对象会自动向上寻找所有父对象的变量,父对象的所有变量对子对象是可见的,但反过来则不成立!!那如何通过其他手段实现呢?
这就是本文的重点:闭包
--概念
关于变量的作用域,分为全局变量和局部变量两种
关于什么是闭包,网上的说法很多,个人认为较准确的一种:“Javascript允许使用内部函数(函数定义和函数表达式位于另一个函数的函数体内),这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。”简单来讲就是以下两点:
1、内部函数有访问外部函数的局部变量x
2、内部函数在外部函数之外被调用读取x
--代码诠释
外部函数之外无法直接访问外部函数的局部变量x,利用闭包则能够做到。
<script type="text/javascript">
function parent()
{
//一定要使用var命令,否则声明了的是一个全局变量!
var x= 100;
function child()
{
return x; //返回父函数的局部变量
}
return child;
}
//如果我们直接读取x是做不到的
alert("读取不到x:"+x);
//这样我们就能直接读取x
var childFun = parent();
//调用子函数
var y=childFun();
alert("读取到x:"+y); //读取到x:100
</script>
--使用闭包注意
1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2、闭包会在父函数外部,改变父函数内部变量的值。