關於js中的回收機制,通俗版

来源:http://www.cnblogs.com/pssp/archive/2016/02/27/5223744.html
-Advertisement-
Play Games

在前面的幾篇文章中,我講解過了js中的回收機制,但是對於當時的我來說,我自己對回收機制的這個概念也有些懵懵懂懂,現在對回收機制有了更深入的理解,所以特此發佈此文給於總結,也好加深記憶。 如果你想學習閉包那麼js中的回收機制是必不可少的,當然學習閉包除了需要理解js中的回收機制以外還需要瞭解其他的概念


  在前面的幾篇文章中,我講解過了js中的回收機制,但是對於當時的我來說,我自己對回收機制的這個概念也有些懵懵懂懂,現在對回收機制有了更深入的理解,所以特此發佈此文給於總結,也好加深記憶。

  如果你想學習閉包那麼js中的回收機制是必不可少的,當然學習閉包除了需要理解js中的回收機制以外還需要瞭解其他的概念,我的其他文章有相關的說明,這裡不做閉包的講解。

  為什麼要有回收機制?why?

    打個比方,我有一個記憶體卡,這個記憶體是8G的,我把文件,視頻,音樂,都保存到了這個記憶體卡,隨著我的儲存的內容越來越多,這個記憶體卡已經保存不了了,如果我還想再把其他的文件保存到這個記憶體卡就需要刪除一些文件,但是這些被刪除的文件是我們自己手動刪除的對吧,手動刪除就相當於js中的delete。

  在這些程式語言中同樣也會出現這些問題,對,記憶體!我們聲明的任何變數都需要消耗記憶體,這些變數越多運行的速度也會越慢。當然不只是變數,代碼中的任何東西。這些語言的設計者為瞭解決這些問題,設計了一套代碼的回收規則。

  

  代碼回收規則如下:

    1.全局變數不會被回收。

    2.局部變數會被回收,也就是函數一旦運行完以後,函數內部的東西都會被銷毀。

    3.只要被另外一個作用域所引用就不會被回收

我用幾個例子來證明這些。

 

function a(){
    var user = "追夢子";
    return user;
}
var b = a();
console.log(b); //追夢子

 

  按理說我是不能訪問函數a裡面的變數的,但是我通過全局變數b接收了這個函數a return過後的值,於是最後這段代碼就成了下麵這樣。

function a(){
    var user = "追夢子";
    return user;
}
var b = "追夢子";
console.log(b);

  好像這並看不出什麼代碼回收,那麼我們看接下來的一段代碼。

function a(){
    var num = 0;
    return function(){
        num ++;
        console.log(num);
    };
}
var b = a();
b(); //1
b(); //2
b(); //3

  看到了吧,如果按照正常的做法,那麼輸出的應該是3次1次對,因為函數體一旦運行那麼這個函數體內的代碼就會被清空,既然會被清空那麼下次運行這段代碼的時候num應該還是1,但是這裡情況有些不同,我上面說過函數中的局部變數只要被另外一個作用域所引用那麼這段代碼就不會被銷毀。

  上面的代碼就像這樣

 

function a(){
    var num = 0;
    return function(){
        num ++;
        console.log(num);
    };
}
var b = function(){
        num ++;
        console.log(num);
    };
b();
b();
b();

 

那麼被函數a返回的那個匿名函數的作用域由函數a轉向了window,由於這個匿名函數被全局變數b引用所以不會被銷毀。

function a(){
    var num = 0;
    return function(){
        num ++;
        console.log(num);
    };
}
var b = {
    fn:a()
}
b.fn(); //1
b.fn(); //2
b.fn(); //3

同樣可以,因為匿名函數被對象b的屬性fn引用,改變了它的作用域,簡單來說只要一個函數或者局部變數被改變作用域那麼這個函數或者局部變數就不會被銷毀。

 

 不知道你們能不能聽懂。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在文章初識js中的閉包中講解了閉包的一些概念,但是對於初學者來說可能並不是特別的容易理解,我今天用兩個案例來解釋閉包可能會好理解一些,在講案例之前,我們需要瞭解一些閉包的概念。在看這篇文章之前,請先看上面的那篇文章,不然效果不會太好。 閉包的理解: 所謂的閉包就是可以創建一個獨立的環境,每個閉包裡面
  • 1.字元串類型即String類型 它的值為字元串:由數字,字母,下劃線組成的一串字元 S=“sdf”它就是一個字元串,字元串一般加上雙引號,不加雙引號一般認為是非字元串類型 2.數字類型,即Number類型 數字可以輸入十進位,十六進位,八進位 3.布爾類型即Boolean類型 值為true或者fa
  • 本文主要介紹 AMR(Aduio) 播放 AMR 格式 Base64碼 音頻。 1、必備資料 github AMR 開源庫 :https://github.com/jpemartins/amr.js 用心把這個項目看一遍,對於我下麵說的話,可以忽略啦,代碼是最好的文章,哈哈~~ 2、核心 JS 庫
  • 最近甚是苦悶,屬於邊學邊做,跳進了很多坑,別提有多慘了,不過結果還是不錯滴,縱觀前後,一句話足以概括 “痛並快樂著” ~~~ ok,我少說廢話,下麵來總結下 Web 播放聲音一些註意事項。 說到 Web 我第一件事想起的就是瀏覽器相容性,播放聲音當然也難逃苦海,需要註意以 Trident 為內核 (
  • 本文主要介紹 Flash 播放 AMR 格式 Base64碼 音頻。 在此之前麽有接觸過 Flash ,接觸 AS3 是一頭霧水,不過幸好有 TypeScript 和 JavaScript 的基礎看起來不是很費勁,現學現賣的就是開了 ”跳坑“ 之旅~~~ 1、實現思路 起初一點實現思路都木有,不知道
  • HTML4.01 超文本標記語言,1999年12月24日由W3C組織發佈。 XHTML 擴展的超文本標記語言(eXtensible Hyper Text Markup Language),和HTML4.01具有良好的相容性,並且更加嚴格、純凈。XHTML要求HTML文檔首先必須是一份XML文檔。整個
  • 對css sprites通過例子進行了闡述
  • 一.ajax的作用: 1.就是讓js去讀伺服器上面的數據. 2.無刷新的情況下讀取伺服器上面的數據,例如:驗證賬號和密碼是否正確等. (1)ajax的優點: 1.減少冗餘請求和響應對服務造成的負擔. 2.無刷新更新頁面,帶來更好的用戶體驗. 3.減輕伺服器速寫的負擔,節約空間和寬頻租用成本。 4.採
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...