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

    先写一个简单闭包函数

    function A(){
    var str ='hello world' function B(){ alert(str
    ); } return B; } var C = A(); C();// Helloworld!

    这个闭包函数的执行过程为

    1、定义普通函数 A

    2、在 A 函数内部定义 普通函数 B

    3、在 A 函数中返回 B

    4、执行 A ,并把 A 返回的结果赋值给变量 C

    5、执行 C

    总结起来就是:

    函数A的内部函数B被函数A外的一个变量 c 引用。

    那么闭包的定义就就是:

    有权访问另一个函数内部变量的函数(当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。) 

     JS 的链式作用域:

    子对象会一级一级向上寻找所有父对象的变量,反之不行。
    js中函数内部可以读取全局变量,函数外部不能读取函数内部的局部变量。

    注意!闭包和内存泄漏和内存回收之间的关系

    内存回收:avaScript是一种具有垃圾回收机制的语言——对象在创建时分配内存,当一个对象不再被引用的时候,这个对象就会被浏览器回收,

    否则这个对象就会一直保存在内存中。

     内存泄漏是指我们已经无法再通过js代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。

    致了分配的这块内存永远也无法被释放出来。如果这样的情况越来越多,会导致内存不够用而系统崩溃。

    在上述例子中,B 定义在 A 中,因此 B 依赖于 A ,而外部变量 C 又引用了 B , 所以A间接的被 C 引用,所以C不会被垃圾回收机制回收。

    也就是说,A 不会被 GC 回收,会一直保存在内存中。

    上述例子进行改进

    function A() {
        var count = 0;
        function B() {
           count ++;
           console.log(count);
        }
        return B;
    }
    var C = A();
    C();// 1
    C();// 2
    C();// 3

    count 是函数A 中的一个变量,它的值在函数B 中被改变,函数 B 每执行一次,count 的值就在原来的基础上累加 1 。因此,函数A中的 count 变量会一直保存在内存中。

    当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会 “污染” 全局的变量时,就可以用闭包来定义这个模块

  • 相关阅读:
    shell 守护进程
    leetcode Find Minimum in Rotated Sorted Array II python
    find: missing argument to `-exec'
    php fpm start.sh
    mysql alter
    nginx log format
    leetcode Contains Duplicate II python
    webpack
    各种安装包打包发布工具
    VueJS 事件修饰符
  • 原文地址:https://www.cnblogs.com/xxflz/p/10444714.html
Copyright © 2011-2022 走看看