<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          前端開發閉包理解,JavaScript-閉包

          時間:?2017-10-26閱讀:?1228標簽:?閉包

          官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
            
          閉包(Closure)概念 

          在A函數中定義了一個B函數,在B函數中使用了A函數中的變量,就會產生閉包,其中B就是一個閉包。 
          也可以說,定義在一個函數內部的這個函數就是閉包。 
          理解閉包需要的幾個相關概念 


          1.變量的作用域 


          在ES5中變量有兩個作用域: 
          全局作用域(global) 
          局部作用域(local) 

          在ES6中補充了一個新的作用域-塊級作用域(block) 

          當定義變量的地方沒有被 function 包括則是全局變量,否則就是局部變量。 

          在函數的內部會優先使用局部變量(即使全局變量和局部變量同名亦是如此),在函數調用的過程,會給局部變量創建一個函數棧區(區別于全局棧),來保存這些局部變量。正常情況下在函數調用結束后,函數棧會被垃圾回收機制處理。 


          2.執行上下文 

          代碼的運行會產生執行上下文,如果代碼不運行就沒有。 
          全局代碼產生全局上下文 
          函數代碼產生函數上下文 
          函數嵌套調用形成執行上下文棧 
          執行上下文中保存了執行代碼所需要的各類的數據 
          執行上下文是一個對象,在代碼運行過程中產生,代碼運行完成后就消失. 
          執行上下文的組成 
          自己的執行上下文 
          父級函數的執行上下文 


          全局上下文 
          一旦<script></script>標簽中代碼運行起來,就會產生一個執行上下文,這個執行上下文就是全局執行上下文.全局上下文只有一個 全局執行環境是window對象,所有變量和函數都作為window對象的屬性和方法創建的 所有的代碼都在全局執行上下文中執行 

          函數執行上下文 
          每次調用函數都會產生一個執行上下文,函數調用完成后,會把執行上下文釋放掉。 按照函數的調用順序,這些上下文以棧的形式存儲(先進后出).棧底是全局上下文。 

          3.詞法作用域-靜態作用域 


          js代碼的書寫順序,就決定了變量的作用域。換言之,在函數內部去訪問一個變量,應該去定義這個函數(寫這個函數的位置)的相關作用域中去找,而不是調用這個函數的那個作用域中去找。 

          舉個栗子就比較好懂些,如下圖 


          4.函數的嵌套定義 


          在JS中,在函數體中可以再次定義另一個函數;并且可以多層函數嵌套使用。 


          5.作用域鏈 


          在JS中有兩條鏈,分別是作用域鏈和原型鏈,這里要著重說到作用域鏈。 
          在函數的內部,要確定一個變量的值,會從當前的作用域出發,沿著作用域鏈向上找,如果找到全局作用域中還是沒有找到,那么就會報引用類型錯誤。 

          再次理解閉包 


          從閉包的定義可以抓住兩個關鍵點: 函數嵌套定義 、引用變量 

          通過前面的幾個相關知識點,可以發現在JS中,函數內部可以通過作用域鏈機制輕松得到父級函數內的變量乃至全局變量,而反過來則是行不通的,即函數外部是無法讀取函數內局部變量的。 那么如果有的場景必須要得到函數內部的局部變量時,需要變通方法那么就產生了閉包。 可以在本質上去理解閉包,閉包就是將函數內部和函數外部連接起來的一座橋梁,可以使局部變量被外部函數訪問到,也就是說變相的延長了函數中局部變量的壽命。 上段代碼 

          function f(){ 
          var a = 1; 
          function f1(){ 
          console.log(a); 
          } 
          return f1; 
          } 
          var r = f(); 
          r();
          

          這段代碼執行后,結果輸出為1。也就是說當函數f調用結束后,它的局部變量a并沒有被回收掉。可以說這就是閉包的本質,它使得函數調用結束后,被閉包引用的變量沒有被回收機制干掉而順利存活了下來,還可以被外部訪問和使用。 


          閉包的作用 


          根據前面的理解,可以歸納閉包的作用有: 
          讀取函數內部的變量 
          延長這些變量的生命周期 

          使用閉包的栗子來一個 - 節流函數 ,可以讓一個函數變得"懶",調用一次之后需要隔一段時間才能再次調用,即降低函數的可被調用的頻率。話不多說上代碼 



          上面的代碼中,f1就是被節流函數變懶了的test。 代碼運行中,f函數中t1這個局部變量被f函數內部定義的t函數引用后,當f函數調用執行完畢后,t1這個變量并沒有隨之被回收,而是一直可以被訪問。這就是閉包的體現。 


          閉包的弊端 


          閉包會使函數內的變量一直被保存在內存中, 這是極耗內存的方式。不可以濫用閉包,會對網頁的性能有很大的影響。在IE中可能會導致內存泄露。 
          閉包在函數外部可以訪問并改變函數內部變量的值,這是好事也是壞事。 如果把父級函數作為對象使用,而把閉包作為它的公用方法,而又把其內部變量作為它的私有屬性,這時就一定要注意了,不要輕易改變父級函數內部變量的值。 


          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/16

          閉包原理及題型

          函數被調用之后,會創建一個執行環境及作用域鏈.函數被執行完之后就會被釋放掉,閉包函數執行之后會保留當前活動變量在內部函數作用域鏈中,所以內部函數可以訪問外部變量.

          閉包實現:異步變同步

          在不使用ES6的前提下如何將一個多個異步請求按順序執行呢?要求使用JavaScript代碼按順序依次請求這5張圖片,一次只能請求一張,可以結合 閉包+回調+遞歸 組合來解決

          Js中閉包的概念、原理、作用及應用

          閉包:有權訪問另一個函數作用域中的變量的函數,一般情況就是在一個函數中包含另一個函數。從官方定義我們知道閉包是一個函數,只不過這個函數有[超能力],可以訪問到另一個函數的作用域。為什么說這個叫做[超能力]呢?

          Js閉包有什么用?

          相信很少有人能直接看懂這句話,因為他描述的太學術。我想用如何在Javascript中創建一個閉包來告訴你什么是閉包,因為跳過閉包的創建過程直接理解閉包的定義是非常困難的。

          JS 原生閉包模塊化開發總結

          閉包模塊的第一種寫法;閉包模式的第二種寫法;閉包模式的自動實例化對象的寫法;閉包類的方法注入模式寫法;

          Js閉包的實現原理和作用

          閉包的概念:指有權訪問另一個函數作用域中的變量的函數,一般情況就是在一個函數中包含另一個函數。閉包的作用:訪問函數內部變量、保持函數在環境中一直存在,不會被垃圾回收機制處理

          Js中的閉包與高級函數

          在JavaScript中,函數是一等公民。JavaScript是一門面向對象的編程語言,但是同時也有很多函數式編程的特性,如Lambda表達式,閉包,高階函數等,函數式編程時一種編程范式。

          使用 JS 及 React Hook 時需要注意過時閉包的坑

          閉包是一個函數,它從定義變量的地方(或其詞法范圍)捕獲變量。閉包是每個 JS 開發人員都應該知道的一個重要概念。當閉包捕獲過時的變量時,就會出現過時閉包的問題

          如何才能通俗易懂的解釋js里面的‘閉包’?

          即變量都存在在指定的作用域中,如果在當前作用中找不到想要的變量,則通過作用域鏈向在父作用域中繼續查找,直到找到第一個同名的變量為止(或找不到,拋出 ReferenceError 錯誤)。這是 js 中作用域鏈的概念

          搞懂JS閉包

          閉包(Closure)是JS比較難懂的一個東西,或者說別人說的難以理解, 本文將以簡潔的語言+面試題來深入淺出地介紹一下。在將閉包之前,需要先講一下作用域。JS中有全局作用域和局部作用域兩種。

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网