JavaScript 闭包解析

闭包的本质就是:函数A的内部函数B被A之外的函数C调用了。这样一个闭包的函数在返回时有没有释放资源的栈区。 

了解js的闭包首先要清楚变量作用域的问题

function demo01(){
    var index = 1;
}
demo01(); 
alert(index)// 不会弹出结果 index的作用域在demo01函数内部 
function demo02(){
     index = 2

demo02();
alert(index) 
//会弹出2 因为在函数内部声明变量时没有用var,所以其实index是全局变量,全局变量与某个函数的生命周期无关。

 那么想要从外部获取内部的变量值该如何做呢?

我们可以在demo02中定义一个内部函数:

function demo02(){ 

    var index02 = 3;
    function inner02(){
        alert(index02);
    }
    return inner02;
}
var getnum = demo02();//相当于获取到了inner02
getnum();//弹出结果3

 inner02就是闭包。

//闭包使得index03变量一直存在内存中
//
index03在函数demo03执行完毕后依然存在
function demo03(){
    var index03 = 99; 

    addone=function(){
     index03++;
    }
    function inner03(){
     alert(index03);
    }
    return inner03;
}
var getnum = demo03();
getnum();//弹出结果99
addone();//index03的值增加1  addone本身是全局变量它的值是一个匿名函数,而匿名函数本身也是闭包,可以在函数外部对函数内部的变量进行操作。
getnum();//弹出结果100

 所以滥用闭包可能导致内存泄露,因为闭包使得变量一直在内存中不会被垃圾回收。

如果把demo03当做对象,index03代表属性,inner03代表公开的方法,也要注意不要随便修改内部的属性值。 

 

posted @ 2016-03-23 15:41  lixiaodi  阅读(138)  评论(0编辑  收藏  举报