浅析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呢?code

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

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

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

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

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

那么闭包的特色是什么呢?内存

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

所以使用闭包时要注意不能滥用,可能形成性能较差,ie中出现内存泄露等问题。所以在退出函数时,能够经过删除不常使用的常量来缓解这一状况。作用域

相关文章
相关标签/搜索