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