MarginLon MarginLon
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

MarginLon

http://info.cern.ch
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据类型 类型检测 类型转换
  • 精度问题
  • 堆栈内存 函数底层运行机制 块级作用域
  • GC机制 闭包作用域 let/const/var
    • 1. GC机制
    • 2. 闭包作用域
    • 3. let/const/var
  • 闭包应用
  • DOM
  • BOM
  • This指向
  • 浏览器渲染机制 CRP优化 事件循环机制
  • 函数防抖节流
  • 模块化 柯里化
  • 构造函数 原型
  • CLASS
  • 工厂设计模式 深浅拷贝 深浅合并
  • Iterator/Generator
  • Promise/ Async/ Await
  • HTTP/跨域
  • API
  • AJAX
  • 事件
  • 《JavaScript高级程序设计(第4版)》
MarginLon
2022-04-12
目录

GC机制 闭包作用域 let/const/var

  • 1. GC机制
  • 2. 闭包作用域
  • 3. let/const/var

# 1. GC机制

  • GC:浏览器的垃圾回收机制(内存释放)
    • 栈内存:
      • 加载页面,形成全局context,只有页面关闭后,全局context释放
      • 函数执行私有context,进栈执行;函数中代码执行完成,大部分情况,出栈释放。
        • 特殊:如果当前context的某些内容(一般是一个堆),被context以外内容占用,则不能出栈释放。
    • 堆内存
      • (谷歌):标记清除
        • 浏览器在空闲或指定时间,查看所有堆内存,把没有被任何东西占用的堆内存释放。
      • (IE低版本):引用计数
        • 创建了堆内存,被占用一次,则浏览器计数+1,取消占用计数-1,计数=0释放内存; => 某些情况(循环占用)导致计数混乱,出现“内存泄漏”
    • 释放内存:
      • x=null => 手动取消占用

# 2. 闭包作用域

闭包案例

  • 匿名函数具名化:自执行函数 + 函数表达式
    • 自执行函数:
      • 不会在所处上下文(宿主环境)中声明:设置的名字在外面用不了
      • 在自己执行产生的上下文中会被声明赋值,赋值为函数本身
      • 赋值默认不能被修改,但被其他方式声明则可以修改,以声明为主。
  (function fn(){
    let fn = 100; // 生效
    fn = 100; // 无效
    console.log(fn); // 函数本身
    fn(); // arguments.callee() 递归
  })();
1
2
3
4
5
6
  • EC(FN):
    • 开辟的某个堆内存,被当前EC(FN)外的变量占用,此时当前context即EC(FN)不能被出栈释放
    • 闭包:(大函数执行返回小函数只是其中一种形式)
      • 函数执行产生一个私有context,保护内部私有变量不受污染。[保护]
      • 有可能形成不被释放的context,私有变量和一些值被保存,可供下级context中调取使用。[保存]
      • 闭包特点
        • 保护:保护私有context的私有变量和外界互不影响
        • 保存:context的私有变量和值保存起来
        • 弊端:栈内存太大,影响性能,需合理利用

# 3. let/const/var

  • let VS const
    • let 变量储值可改
    • const 赋值不能再与其他赋值关联
  • let VS var
    • 变量提升:var 存在变量提升 let 不存在变量提升

    • GO:全局context var相当于给GO增一个属性,随动;let和GO没有关系。

    • 重复声明:let不允许同context重复声明(不管先前何种方式声明,都不能let声明,词法解析阶段),var无所谓。

    • let/const/function产生块级私有context

      • context & 作用域
        • 全局context
        • 函数执行的私有context
        • 块级作用域(私有context)
          • 对象 function的大括号 判断,循环和代码块的大括号

                debugger;//开启断点调试,控制台基于F10/F11 逐过程/逐语句 控制执行
                //代码块不会对n产生限制,n使全局context
                {
                    var n = 12;
                    console.log(n);
            
                    let m = 13;
                }
                console.log(n);
                console.log(m);// m is not defined
            
            
                let i = 0;//不产生块级context
                for (; i< 5;i++)
                {
                    console.log(i);
                }
                console.log(i);//5
            
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
    • 暂时性死区(基于typeof检测一个未被声明的变量,不会报错,结果是'undefined')

      • 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

        console.log(typeof n);//undefined
        let n = 12;//使上一句报错 
        
        1
        2

      var


编辑 (opens new window)
上次更新: 2023/04/01, 15:26:22
堆栈内存 函数底层运行机制 块级作用域
闭包应用

← 堆栈内存 函数底层运行机制 块级作用域 闭包应用→

最近更新
01
KnockoutJS
11-12
02
综述
10-17
03
前言
10-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 MarginLon | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式