js-闭包

  在JS中,闭包是一个重点,也是一个难点。因为闭包对像JAVA这类语言的coder会觉得很生涩难懂,对初学的js的coder(本人也是初学的菜鸟)会感到难以理解,在这根据自己对闭包的一些浅显的理解分享出来。若有不对的地方,望多多包含。

闭包

闭包,指的是在函数里的函数。(其实闭包就是被嵌套的那个函数)

function closeBag(){
    function(){} // 这个匿名函数就是一个闭包
}

了解了什么是闭包之后,来认识一下闭包的作用。

作用一:获取函数内部的局部变量并将其驻留在内存中
  在JS中有函数作用域,在函数内通过var定义的变量,外部作用域无法直接获取。既然只是外部作用域无法获取。那么,它的子作用域便可以获取到,我们想将这个局部变量返回到外部作用域,那么便可以通过闭包完成该传递。
  在这有人就会疑惑,如果只是需要获取函数内部的局部变量,直接将需要的局部变量return不就可以拿到了吗?的确,若只是需要获取局部变量,的确可以通过这种方式。但如果要实现计数功能,那么闭包使局部变量驻留在内存中的作用便显现了出来。

function closeBag2(){
        var num = 22;
        // 通过闭包将举报变量返回到外部作用域
        return function() {
            return num++;
        }
    }

    var num = closeBag2();

    console.log(num()); // 22
    console.log(num()); // 23
    console.log(num()); // 24
    console.log(num()); // 25

作用二:封闭作用域
  通过自调用函数形成一个封闭作用域(相当于JAVA的块级作用域),在该封闭作用域内,定义的变量和函数都是私有的,全局作用域并不能直接访问,但可以通过返回一个对象来获取该封闭作用域里的方法或变量。通常,我们利用这种封闭作用域来封装一些我们常用的方法库。
自调用函数写法: (function(){})()

封装库例子:
var utils = (function(){
        function add(){}
        function mul(){}
        function sub(){}

        return {
            add: add,
            mul: mul,
            sub: sub
        }
    })();

  以上是我对闭包的浅显的理解,希望有大神指出我的不足和对闭包知识点的补充,万分感谢。

你可能感兴趣的:(JavaScript)