JavaScript初探-----闭包的理解

前言

闭包是js中一个比较深奥晦涩的概念,需要好好理解,下面我就从各个方面来理解一下闭包。
首先,闭包匿名函数是完全不一样的概念,闭包是指有权访问另一个函数作用域中的变量的函数,其实就是将函数内部和函数外部连接起来的一座桥梁。匿名函数就是没有名字的函数。

闭包的用途

我们先来看两个例子:

var a = 10;
function fn(){
    alert(a);
};
fn();  //10

在外部定义了全局变量,在函数fn内部可以读取。

function fn(){
    var a = 10;
};
alert(a); //a is not defined

在函数内部定义局部变量,在外部无法识别到。

有时候,我们需要在外部得到函数内的局部变量,但是正常情况下无法做到的,所以我们需要使用闭包来实现。


function f1(){
    var a = 10;
    function f2(){
        alert(a);
    }
    return f2;
};
var result = f1();
result();  //10

在上例中,我们在函数f1内部再定义了一个f2函数,这时f1内部的所有局部变量对f2都是可见的,但是f2内部的局部变量对f1不可见,这时因为“链式作用域”结构。然后将f2作为返回值,这时就可以在f1外部读取到它的内部变量了。

再看另外一个例子:

function f1(){
    var a = 10;
    add = function(){
        a = a+1;
    }
    function f2(){
        alert(a);
    }
    return f2;
};
var result = f1();
result();  //10
add();
result();  //11

在这段代码中,result实际就是闭包f2函数,它运行了两次,值分别是10和11,这样说明,局部变量a一直保存在内存中,并没有被自动清除。
这是什么原因呢?其实是因为f1是f2的父函数,而f2被赋给了一个全局变量,导致f2一直在内存中,而f2存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制回收,所以a也没有被清除。

看完上面,我们可以总结一下闭包的用处:

  1. 读取函数内部的变量;
  2. 让函数内部的变量始终保持在内存中。

总结

闭包是一个经常使用到的方法,为了防止变量污染,加强封装性,但是在使用时,也要注意以下:
1. 闭包会使函数中变量都被保存在内存中,内存消耗会比较大,所以不能滥用闭包,否则会造成性能问题,在IE中还会导致内存泄露,所以在退出函数之前,要将不使用的局部变量都删除(将值设为null)。
2. 闭包在父函数外部来改变父函数内部的值,所以把父函数当对象使用,把闭包当公用方法使用,把内部变量当做私有属性来使用时,切记不要随便改变函数内部变量的值。

猜你喜欢

转载自blog.csdn.net/weixin_42052760/article/details/80251505