js閉包理解

来源:http://www.cnblogs.com/alinsion/archive/2017/12/04/7979473.html
-Advertisement-
Play Games

為了完全理解這個老生常談的東西,查來查去,算是初步知道這是個什麼鬼,怎麼用,為什麼用 閉包: 外部函數定義的內部函數就是閉包。 閉包的作用及好處: 閉包給訪問外部函數定義的內部變數創造了條件。也將關於函數的一切封閉到了函數內部,減少了全局變數,這也是閉包的真實含義。 在理解閉包之前.最好能先理解一下 ...


為了完全理解這個老生常談的東西,查來查去,算是初步知道這是個什麼鬼,怎麼用,為什麼用     閉包: 外部函數定義的內部函數就是閉包。     閉包的作用及好處: 閉包給訪問外部函數定義的內部變數創造了條件。也將關於函數的一切封閉到了函數內部,減少了全局變數,這也是閉包的真實含義。     在理解閉包之前.最好能先理解一下作用域鏈的含義,   簡單來說,作用域鏈就是函數在定義的時候創建的,用於尋找使用到的變數的值的一個索引,   而他內部的規則是,把函數自身的本地變數放在最前面,把自身的父級函數中的變數放在其次,把再高一級函數中的變數放在更後面,以此類推直至全局對象為止.   當函數中需要查詢一個變數的值的時候,js解釋器會去作用域鏈去查找,從最前面的本地變數中先找,如果沒有找到對應的變數,則到下一級的鏈上找,一旦找到了變數,則不再繼續.如果找到最後也沒找到需要的變數,則解釋器返回undefined.     瞭解了作用域鏈,   我們再來看看js的記憶體回收機制,   一般來說,一個函數在執行開始的時候,會給其中定義的變數劃分記憶體空間保存,以備後面的語句所用,等到函數執行完畢返回了,這些變數就被認為是無用的了.對應的記憶體空間也就被回收了.下次再執行此函數的時候,所有的變數又回到最初的狀態,重新賦值使用.   但是如果這個函數內部又嵌套了另一個函數,而這個函數是有可能在外部被調用到的.並且這個內部函數又使用了外部函數的某些變數的話.   這種記憶體回收機制就會出現問題.   如果在外部函數返回後,又直接調用了內部函數,那麼內部函數就無法讀取到他所需要的外部函數中變數的值了.   所以js解釋器在遇到函數定義的時候,會自動把函數和他可能使用的變數(包括本地變數和父級和祖先級函數的變數(自由變數))一起保存起來.也就是構建一個閉包,   這些變數將不會被記憶體回收器所回收,只有當內部的函數不可能被調用以後(例如被刪除了,或者沒有了指針),才會銷毀這個閉包,而沒有任何一個閉包引用的變數才會被下一次記憶體回收啟動時所回收.   與普通函數的區別: 1,普通函數也能曝光內部的值。方法A定義全局變數,但占用的記憶體無法釋放且函數使用的變數定義到了函數外部不便於理解和管理。方法B將內部變數當參數傳遞,此種方法不美觀太醜陋。 2,函數每次執行時都會且只會初始化其內部變數,導致了閉包與普通函數的最大區別。就是每次調用普通函數時它內部都被初始化成一致狀態,導致執行的結果是一致的。閉包不同,它的本質是內部函數,調用閉包只會初始化內部函數變數,外部函數的變數沒有被初始化,實現了變數值的傳遞。外部函數只在定義閉包時被初始化。閉包消亡時記憶體被回收。   什麼時候需要使用閉包: 當每次調用函數A時都要改變全局變數B,且B只與A有關。以往沒有閉包時只能將B定義為全局變數,現在可以將B定義為A的內部變數,同時在A內部定義閉包C,並將C當值返回。   搞事情總得寫點代碼,那就寫寫吧:
 1 function gg(){
 2     var b = 0;
 3     return function(){
 4         b++;
 5         return b
 6     }
 7 }
 8 var tt = gg();
9 tt() //1 10 tt() //2 11 tt() //

 

 

閉包的特點很鮮明,閉包內,變數無法釋放,無法被直接訪問;閉包可以被延遲執行。所以可以用它來做一些事情: 管理私有變數和私有方法,將對變數(狀態)的變化封裝在安全的環境中 需要註意的,由於閉包內的部分資源無法自動釋放,容易造成記憶體泄露    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章目標 一、掌握基本UI組件中文本和圖像組件的使用 二、掌握基本UI組件中各種按鈕類型組件的使用 一、UI組件介紹 Android的UI組件分為兩大類: 1、佈局組件(ViewGroup)。 --用來定義界面組件之間的位置和關係 2、交互組件(View)。 --用來實現與用戶的交互。 二、文本控制項 ...
  • DOM 是為了操作文檔出現的 API,document 是其的一個對象; BOM 是為了操作瀏覽器出現的 API,window 是其的一個對象。 使用下圖講解: 歸DOM管的: E區:即document 歸BOM管的: A區:瀏覽器的地址欄,書簽欄等 B區:右鍵菜單 C區:document載入時的狀 ...
  • 1. 標準盒模型: 因為 ,所以,同樣寬度的內容因為 和`padding box sizing:border box content_box_width = width` 。 2. 彈性盒模型: 彈性佈局相比傳統的塊佈局要簡潔很多,但是實現原理差別挺大的。首先,要想進行彈性佈局,要設置 ,確定彈性容 ...
  • SVG作為時下比較新穎的技術標準,已經建立了很多基於SVG的前端項目。由於SVG在繪製路徑上非常靈活,我們將很多網頁上的元素使用SVG來繪製而成,有各種人物、小圖標、小動畫等等。今天我們收集了10個非常新奇有趣的SVG繪製動畫,這些動畫大部分都是使用SVG結合一定的CSS3特性實現而成,效果讓人大為 ...
  • 以前遇到一個問題,頁面編碼沒問題,後臺返回的編碼也沒問題,但是ajax返回的json就是不講道理的亂碼,查看過http響應頭信息發現請求編碼與頁面編碼不一致 網上搜了好多方法,包括改編碼,重新建頁面都不行! 最後解決方法: 加上了 contentType: "application/x-www-fo ...
  • 4. 前端工程化開發實踐 由於Nodejs 、npm的環境搭建往上很多,這裡就不過多介紹它們了。 這裡我們將更多介紹FIS3、RequireJS 、r.js。 4.1 模塊化開發: 4.1.1 開發目錄結構 左圖為開發目錄結構, 右圖中新增js 目錄、fis-conf.js文件,js 目錄用來存放r ...
  • 介紹ECMAScript各版本的內容,以及使用Babel把ES6及以上的代碼編譯為ES5. ...
  • 參考網址:http://blog.sina.com.cn/s/blog_6961ba9b0102wwye.html 第一次新增時沒有問題,編輯器裡面內容為空,編輯數據時,也是正常,但是第二次點擊新增時會出現編輯時的內容。 分析可能是第二次新增時還是取的上次的實例,即使用CKEDITOR.instan... ...
一周排行
    -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# ...