JavaScript闭包学习笔记

作者: 7091a52ac9e5 | 来源:发表于2016-03-13 19:40 被阅读404次

    @(JS技巧)[闭包]

    JavaScript闭包学习笔记

    什么是闭包?

    1. 有些情况下,函数调用完成之后,其执行上下文环境不会接着被销毁。这就是需要理解闭包的核心内容。
    2. 闭包的关键在于,返回值为函数,且函数内部参数与其父作用域有关。
    3. 闭包就是能够读取其他函数内部变量的函数
      由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
    4. 所谓“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层外层函数体中的临时变量。这使得只要目标 对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目 标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新 的值,和上次那次调用的是各自独立的。

    闭包的实现形式?

    1. 函数作为返回值;
    function fu(){
        var max = 10;
        return function bar(x){
            if (x>max) {
                console.log(x);
            }
        }
    }
    
    var f1 = fn();
    f1(15);
    
    1. 函数作为参数传递。
     var max = 10,
            fn = function(x){
                if (x>max) {
                    console.log(x);
                }
            };
        (function(f){
            var max = 100;
            f(15);
        })(fn);
    

    闭包产生的机理

    函数能产生一个独立的作用域,在JS中函数是一等公民,其可以被当做参数传递;当运行时需要调用该函数,因此需要调用其上下文环境,因此其上下文环境得以保存;内存中保存着更多的上下文环境,这也是其开销大的原因;

    闭包的产生与函数的执行环境(excution context)、活动对象(call object)、作用域(scope)、作用域链(scope chain)密不可分。

    闭包的用途

    闭包可以用在许多地方。它的最大用处有两个,

    1. 一个是前面提到的可以读取函数内部的变量,
    2. 另一个就是让这些变量的值始终保持在内存中,通过在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
    3. 保护函数内的变量安全。
    4. 通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)

    使用闭包的注意事项

    1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
    2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

    Javascript的垃圾回收机制

    在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。

    参考文献

    深入理解javascript原型和闭包(15)——闭包
    学习Javascript闭包(Closure)

    相关文章

      网友评论

        本文标题:JavaScript闭包学习笔记

        本文链接:https://www.haomeiwen.com/subject/tiqflttx.html