摘要:在中,變量只有兩種,全局變量和局部變量。這里要注意的是定義局部變量必須加上,否則定義了全局變量。上面也可以這樣實現(xiàn)那么閉包的特點是什么呢首先是之前一直在強調(diào)的可以訪問一個函數(shù)的局部變量。
**什么是閉包?**
閉包是指所有能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在JavaScript中,變量只有兩種,全局變量和局部變量。區(qū)別在于任何函數(shù)都可以直接對全局變量進(jìn)行訪問,而局部變量則只有當(dāng)前函數(shù)以及定義在該函數(shù)內(nèi)部的函數(shù)可以進(jìn)行訪問。
訪問全局變量如下:
var a = 1; function show() { console.log(a); }; var showTest = show(); //1 此時函數(shù)訪問的是全局變量a
但是如果是在函數(shù)內(nèi)部定義了變量a,那么在函數(shù)外部是不可訪問的。這里要注意的是定義局部變量必須加上var,否則定義了全局變量a。
function show() { var a = 100; }; console.log(a) //此時會報錯,a未定義
那么想訪問函數(shù)內(nèi)部的變量a有什么方法呢,不考慮直接返回變量a的情況。因為內(nèi)部函數(shù)可以通過作用域鏈訪問到父函數(shù)的局部變量,那我們是不是可以在函數(shù)內(nèi)部定義一個函數(shù)來讀取a呢?
function show() { var a = 100; var inShow = function() { console.log(a); }; return inShow; }; var showTest = show(); showTest(); //100
這就是閉包,通過內(nèi)部函數(shù)訪問父函數(shù)的變量,再通過返回內(nèi)部函數(shù),使可以在外部訪問函數(shù)的局部變量。上面也可以這樣實現(xiàn)
function show() { var a = 100; return function() { console.log(a); }; }; var showTest = show(); showTest(); //100
那么閉包的特點是什么呢?
首先是之前一直在強調(diào)的可以訪問一個函數(shù)的局部變量。
可以使變量一直存在內(nèi)存中。怎么理解呢?如上例子中,我們通過返回inShow函數(shù),并將其賦值給一個全局變量showTest,從而使得函數(shù)inShow一直存在內(nèi)存中,而inShow是函數(shù)show的內(nèi)部函數(shù),所以函數(shù)show也存在內(nèi)存中,不會被銷毀。
因此使用閉包時要注意不能濫用,可能造成性能較差,ie中出現(xiàn)內(nèi)存泄露等問題。因此在退出函數(shù)時,可以通過刪除不常使用的常量來緩解這一情況。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/96570.html
摘要:響應(yīng)式原理之不論如何,最終響應(yīng)式數(shù)據(jù)都要通過來實現(xiàn),實際要借助新增的。在函數(shù)內(nèi),首先實例化一個實例,會在稍后添加為響應(yīng)式數(shù)據(jù)自定義的中發(fā)揮作用。只有數(shù)組和對象才可能是響應(yīng)式,才能返回實例。參考鏈接技術(shù)內(nèi)幕揭開數(shù)據(jù)響應(yīng)系統(tǒng)的面紗源碼 Vue響應(yīng)式原理之defineReactive defineReactive 不論如何,最終響應(yīng)式數(shù)據(jù)都要通過defineReactive來實現(xiàn),實際要借助...
摘要:實際上,閉包和匿名函數(shù)是偽裝成函數(shù)的對象。容器流程淺析是社區(qū)中比較流行的容器。服務(wù)提供者服務(wù)提供者是連接容器與具體功能實現(xiàn)類的橋梁。服務(wù)提供者需要實現(xiàn)接口所有服務(wù)提供者必須實現(xiàn)接口方法。但已經(jīng)完成了服務(wù)提供者的注冊工作。 需要具備的知識點 閉包 閉包和匿名函數(shù)在PHP5.3.0中引入的。 閉包是指:創(chuàng)建時封裝周圍狀態(tài)的函數(shù)。即使閉包所處的環(huán)境不存在了,閉包中封裝的狀態(tài)依然存在。 理論上...
摘要:一前言的垃圾回收機制使用垃圾回收機制來自動管理內(nèi)存。垃圾回收器只會針對新生代內(nèi)存區(qū)老生代指針區(qū)以及老生代數(shù)據(jù)區(qū)進(jìn)行垃圾回收。分別對新生代和老生代使用不同的垃圾回收算法來提升垃圾回收的效率。 V8 實現(xiàn)了準(zhǔn)確式 GC,GC 算法采用了分代式垃圾回收機制。因此,V8 將內(nèi)存(堆)分為新生代和老生代兩部分。 一、前言 V8的垃圾回收機制:JavaScript使用垃圾回收機制來自動管理內(nèi)存。垃...
摘要:任何一層報錯,都能用捕獲總結(jié)是一個非常輕量級的框架,只實現(xiàn)了中間件處理流程和對對象的封裝。其他的功能都由外部中間件提供。 koa 的中間件機制巧妙的運用了閉包和 async await 的特點,形成了一個洋蔥式的流程,和 JS 的事件流 (捕獲 -> target -> 冒泡) 相似 handleRequest(ctx, fnMiddleware) { const res ...
閱讀 2032·2021-11-11 16:55
閱讀 2310·2021-10-08 10:13
閱讀 862·2019-08-30 11:01
閱讀 2289·2019-08-29 13:19
閱讀 3365·2019-08-28 18:18
閱讀 2694·2019-08-26 13:26
閱讀 654·2019-08-26 11:40
閱讀 1958·2019-08-23 17:17