浅析js闭包

闭包是指所有能够读取其他函数内部变量的函数。在JavaScript中,变量只有两种,全局变量和局部变量。区别在于任何函数都可以直接对全局变量进行访问,而局部变量则只有当前函数以及定义在该函数内部的函数可以进行访问。

访问全局变量如下:

var a = 1;
function show() {
    console.log(a);
};

var showTest = show(); //1 此时函数访问的是全局变量a

  

但是如果是在函数内部定义了变量a,那么在函数外部是不可访问的。这里要注意的是定义局部变量必须加上var,否则定义了全局变量a。

function show() {
    var a = 100;
};

console.log(a) //此时会报错,a未定义

  

那么想访问函数内部的变量a有什么方法呢,不考虑直接返回变量a的情况。因为内部函数可以通过作用域链访问到父函数的局部变量,那我们是不是可以在函数内部定义一个函数来读取a呢?

function show() {
    var a = 100;
    var inShow = function() {
        console.log(a);
    };
    return inShow;
};

var showTest = show();
showTest(); //100

  

这就是闭包,通过内部函数访问父函数的变量,再通过返回内部函数,使可以在外部访问函数的局部变量。上面也可以这样实现

function show() {
    var a = 100;
    return function() {
        console.log(a);
    };
};

var showTest = show();
showTest(); //100

  

那么闭包的特点是什么呢?

  1. 首先是之前一直在强调的可以访问一个函数的局部变量。
  2. 可以使变量一直存在内存中。怎么理解呢?如上例子中,我们通过返回inShow函数,并将其赋值给一个全局变量showTest,从而使得函数inShow一直存在内存中,而inShow是函数show的内部函数,所以函数show也存在内存中,不会被销毁。

因此使用闭包时要注意不能滥用,可能造成性能较差,ie中出现内存泄露等问题。因此在退出函数时,可以通过删除不常使用的常量来缓解这一情况。

posted @ 2018-09-09 11:52  Pomm  阅读(90)  评论(0编辑  收藏  举报