zoukankan      html  css  js  c++  java
  • JS闭包原理

    闭包在JavaScript高级程序设计(第3版)中是这样描述:闭包是指有权访问另一个函数作用域中的变量的函数。

    那么闭包的作用也就很明显了。

    1. 可以在函数的外部访问到函数内部的局部变量。 
    2. 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。

    闭包表现表现形式,这里举个例子:

    function foo() {
       var a = 10;
       function bar() {
        a *= 2;
        return a;
       }
       return bar;
    }
    var baz = foo(); // baz is now a reference to function bar.
    console.log(baz()); // returns 20.
    console.log(baz()); // returns 40.
    console.log(baz()); // returns 80.
    var blat = foo(); // blat is another reference to bar.
    console.log(blat()); // returns 20, because a new copy of a is being used.
    

      示例中,baz和balt各有各的作用域及a的一个副本,而且只有他们自己能对其进行修改。

           所谓“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。

    这使得只要目标 对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。

            尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。

    即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新 的值,和上次那次调用的是各自独立的

     

    三、闭包注意点

    1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。

          解决方法是,在退出函数之前,将不使用的局部变量全部删除。

  • 相关阅读:
    如何利用书签向word文档读取或写入数据[C#](
    一个较为完整的例子,还可以,简单一些的
    GridView的RowDataBound事件可做的一些事情
    ASP.NET中DataGrid和DataList控件用法比较
    GridView中绑定数据字段时可做的几种操作方法
    GridView中如何取得隐藏列的值
    一些常用的算法技巧总结
    位运算装逼指南
    小胖求学系列之文档生成利器(上)smartdoc
    系统监控之硬盘使用率
  • 原文地址:https://www.cnblogs.com/651434092qq/p/12525336.html
Copyright © 2011-2022 走看看