摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數作用域達到了訪問外層變量的目的。此時一個完整的閉包實現了,的垃圾回收機制由于閉包的存在無法銷毀變量。
1.閉包是指有權訪問另一個函數作用域中的變量的函數。
上面這段話來自 javascript 高級程序設計 第三版 P178 。作者說閉包是一個函數,它有訪問另一個函數作用域中的變量的能力。
2.函數訪問它被創建時所處的上下文環境。這被稱為閉包。
這段話來自 javascript 語言精粹 修訂版 P38 。作者沒有定義閉包為何物,只是說函數訪問它被創建時的上下文環境,這種xxx(行為?過程?能力?) 被稱為閉包。
3.1閉包是依賴于詞法作用域編寫代碼而產生的結果3.2閉包就是函數能夠記住并訪問它的詞法作用域,即使當這個函數在它的詞法作用域之外執行時
這兩段話來自 You-Dont-Know-JS 作用域閉包 這一章,作者說閉包是一種結果。
閉包的一般定義閉包是一種抽象概念,每個人對其理解不同,所以有了上面的幾種解釋。但大家討論的確是同一個問題。
//step 1 function outer() { var a = "hello world"; function inner() { return a ; } return inner(); } // hello world outer();
我們發現位于 outer 函數內的 inner 函數可以訪問到另一個函數 outer 的作用域中的變量 a 。完美的閉包,對,閉包就這么簡單。哈哈哈哈哈,本文結束!!!
閉包的由來其實上面那段代碼并不是大家真正所說的閉包,它其實是利用了函數作用域的特點 -- 內層函數可以訪問外層變量。這僅僅是閉包的一部分,閉包利用函數作用域達到了訪問外層變量 a 的目的。
依據定義 1,閉包可以說在代碼 step1 中已經產生了。
我們接下來看 step2:
//step 2 function outer() { a = "hello world"; function inner() { return a; } return inner(); } var c = outer(); // hello world c;
這次我們執行 outer 函數, outer() 是一個函數對象,在內部只會返回 inner 函數的結果 a ,因為 inner 函數的存在,每次執行 inner 便會對變量 a 進行引用,這會導致變量 a 的引用計數為 1 ,從而垃圾回收機制無法銷毀變量 a。我們便在函數執行完畢后依然訪問到了變量 a。正規的寫法如 step3:
//step3 var c = (function() { var a = "hello world"; return { inner : function() { return a; } } })(); // hello world c.inner();
我們利用自執行匿名函數把 inner 函數保存到對象 c 上,這時 c.inner 就是 inner 函數,它可以訪問到 inner 函數之外的變量 a 。變量 c.inner 引用了變量 a 的值,導致變量 a 在函數執行后依然無法被銷毀 。此時一個完整的閉包實現了, js 的垃圾回收機制由于閉包的存在無法銷毀變量 a。我們利用閉包,在函數外層還是訪問到了 a ,保存了函數內部的細節。這就是閉包的全部。由此得來下面定義:
4.閉包是阻止垃圾回收機制在內存中銷毀變量的方法,使得在創建變量的執行環境外可以訪問到該變量
上面這段話來自 單頁Web應用 JavaScript 從前端到后端 P49,個人認為這本書也是對閉包解釋最為詳盡生動的一本書。因為此書中大量使用了模塊模式所以對閉包的解釋十分詳盡。
總結一下:閉包是由函數產生的「函數可以創建新的作用域」,當我們把它賦值給一個變量后,一個完整的閉包出現了。它阻止了 js 的垃圾回收機制對函數內部變量的回收,導致函數內部變量的引用計數一直不為 0,無法被垃圾收集器回收。所以我們常聽亂用閉包可能導致內存泄漏,就是因為閉包的這個特點。
函數作用域的特性讓我們可以從函數內部取得函數外部的變量,而閉包提供了一種反向的操作可能 -- 我們在函數的外部也可以取得函數內部的變量
閉包是函數外可以訪問函數內變量的實現
其它:
StackOverflow 閉包是什么
閉包的用處:You-Dont-Know-JS
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81109.html
摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么。看到閉包在哪了嗎閉包到底是什么五年前,我也被這個問題困擾,于是去搜了并總結下來。關于閉包的謠言閉包會造成內存泄露錯。閉包里面的變量明明就是我們需要的變量,憑什么說是內存泄露這個謠言是如何來的因為。 本文為饑人谷講師方方原創文章,首發于 前端學習指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...
摘要:到底什么是閉包這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數的作用域及其所有變量都會在函數執行結束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設計理念,有人說所有的函數都是閉包。到底什么是閉包?這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...
閱讀 2689·2023-04-25 17:21
閱讀 2550·2021-11-23 09:51
閱讀 2837·2021-09-24 10:32
閱讀 3769·2021-09-23 11:33
閱讀 1974·2019-08-30 15:44
閱讀 3452·2019-08-30 11:18
閱讀 3519·2019-08-30 10:53
閱讀 623·2019-08-26 13:25