JavaScript闭包学习笔记

@(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闭包学习笔记)