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>

點擊查看詳情

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM