• js的内存释放初步理解


    1.堆内存:定义对象或函数,首先都会开一个堆内存且有一个引用地址,如果有变量知道了这个引用地址,我们就说该堆内存被占用了,不能被销毁
    2.堆内存释放或销毁:把所有知道该引用地址的变量赋值null,即没人知道该引用地址,浏览器就会在空闲的时候销毁它,也叫垃圾回收
    3.栈内存:有两种类别,全局作用域和私有作用域
    4.全局作用域的栈内存:页面关闭的时候,才会销毁
    5.私有作用域的栈内存(只有函数执行的时候才有私有作用域):
      a.一般情况:函数执行会形成一个新的私有作用域,当私有作用域的代码执行完之后,栈内存会自动销毁和释放
      b.特殊情况:私有作用域的部分内存被其他作用域知道了,那么该栈内存就属于被占用,不会被销毁,常见的两种情况:
        5.1.函数执行返回一个引用类型的值,且在别的作用域被接收了,该栈内存不会被销毁
        5.2.私有作用域中,给DOM元素的事件绑定方法,该栈内存不会被销毁

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <title>Document</title>
    </head>
    
    <body>
      <script>
      var obj = {
        a: 1
      };
      // 开辟了一个堆内存,引用地址赋值给了obj
      obj = null;
      // {a:1}的堆内存引用地址没有人知道了,浏览器在空闲时间就回收了这个内存
      function fn() {
        console.log(obj);
      }
      // fn执行的时候,产生一个私有作用域,执行完因为返回值不是引用类型且没有dom元素绑定方法,私有作用域的栈内存销毁
      fn();
    
      function tn() {
        return function() {}
      }
      // fn执行的时候,产生一个私有作用域,执行完因为返回值是引用类型,也就是t知道了返回值的引用地址,而返回值存在于私有作用域,那么私有作用域不能被销毁
      var t = tn();
      // tn返回一个函数,虽然没有变量知道其引用地址,但是因为还要被执行一次,所以暂时不销毁,当返回值执行完成之后,浏览器空闲时间会销毁私有作用域
      tn()();
    
      function en() {
        document.body.onblur = function() {
          document.title = "/(ㄒoㄒ)/~~"
        }
        document.body.onfocus = function() {
          document.title = "(づ ̄3 ̄)づ╭❤~"
        }
      }
      // 因为执行的时候 里面dom元素绑定方法,所以产生的私有作用域也不会被销毁
      en()
      </script>
    </body>
    
    </html>

    点击查看详情

  • 相关阅读:
    JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)
    对js原型对象、实例化对象及prototype属性的一些见解
    Javascript中的undefined、null、""、0值和false的区别总结
    new Function()语法
    声明函数的方法 之 语句定义法(函数声明法)和表达式定义法(函数表达式)
    匿名函数function前面的! ~等符号作用小解
    proxyTable设置代理解决跨域问题
    vue之递归组件实现树形目录
    关于页面出现弹窗时,页面还可以滚动问题
    倒计时功能
  • 原文地址:https://www.cnblogs.com/2han/p/6273054.html
Copyright © 2020-2023  润新知