摘要:閉包反正看完我就懂了想要好好的理解閉包,你得首先理解作用域。其實(shí)這個(gè)閉包的產(chǎn)生過程可以理解為在里面的匿名函數(shù)定義時(shí)正處于懷孕階段,到外面調(diào)用時(shí),娃就出生了,娃就是閉包啦。閉包改變了變量的生命周期,變量將得到永生。
閉包?反正看完我就懂了
想要好好的理解閉包,你得首先理解作用域。別說了,趕緊去看作用域吧,?,這世界就是如此殘酷。好,言歸正傳,我們是來學(xué)習(xí)閉包的。O(∩_∩)O
什么是閉包??百度了一波,but理解不了哇。別怕,我來幫你。其實(shí),可以這樣理解的:魔術(shù)師的幕后藏著一個(gè)人,我們要揭開他的偽裝,偽裝之后的那個(gè)人是..知道你會(huì)說就是閉包了。閉包就是函數(shù)定義時(shí)的上下文環(huán)境。
get閉包說了這么久,還不上菜,都快要餓死了。
菜來了!?閉包只要記住:
閉包產(chǎn)生是:函數(shù)內(nèi)嵌套函數(shù);
閉包函數(shù)在外面被調(diào)用,訪問;
閉包可以訪問外部的變量,但是外部的變量不能訪問內(nèi)部;
閉包可以保持對(duì)定義時(shí)的作用域的引用,使之不被銷毀,長(zhǎng)生不老。
可能你又懵了,不怕,咱用實(shí)例來說話。
實(shí)例一:function foo(){ var a=2; function bar(){ console.log(a);//2 } bar(); } foo();
這看起來應(yīng)該就是閉包吧,不,確切地說它不是。因?yàn)閎ar()嵌套在foo()內(nèi)部,這里并沒有在外面調(diào)用bar().
閉包來啦var func=function(){ var a=1; return function(){ a++; alert(a); } } var f=func(); f();//閉包哇!
函數(shù)f()的詞法作用域能夠訪問func()的內(nèi)部作用域,然后把里面的匿名函數(shù)function()本身當(dāng)作一個(gè)值類型進(jìn)行傳遞。其實(shí)這個(gè)閉包的產(chǎn)生過程可以理解為在里面的匿名函數(shù)定義時(shí)正處于懷孕階段,到外面f()調(diào)用時(shí),娃就出生了,娃就是閉包啦。
不一般的閉包有時(shí)候?qū)瘮?shù)類型的值進(jìn)行參數(shù)傳遞有很多種方法,但是不要方,當(dāng)他們?cè)趧e處被調(diào)用時(shí)仍然可以觀察到閉包。
看下面:
function foo(){ var a=2; function baz(){ console.log(a);//2 } bar(baz); } function bar(fn){ ? ?fn();//媽,閉包又來啦 }
把內(nèi)部的函數(shù)baz傳遞給bar,當(dāng)調(diào)用這個(gè)內(nèi)部函數(shù)時(shí)(現(xiàn)在叫fn()),它涵蓋的foo()內(nèi)部作用域就出來了,因?yàn)樗軌蛟L問a.
還有這樣的閉包function wait(message){ setTimeout(function timer(){ console.log(message); },1000); } wait("Hello,closure!");
將一個(gè)內(nèi)部函數(shù)(名為timer)傳遞給setTimeout(...)。timer具有涵蓋wait(...)作用域的閉包,還保留著對(duì)變量message的引用。
循環(huán)和閉包for(var i=1;i<=5;i++){ (function(){ var j=i; setTimeout(function trimer(){ console.log(j); },j*1000); })(); }
在for循環(huán)里面,我們?cè)诿總€(gè)迭代過程中都創(chuàng)建了一個(gè)閉包作用域,且作用域內(nèi)定義了變量,進(jìn)行了賦值。閉包改變了變量的生命周期,變量將得到永生。
小結(jié):閉包是隱藏在函數(shù)里面卻又很厲害的。相信你已經(jīng)理解了閉包,那么恭喜你,從某種意義上獲得了重生!
閉包其實(shí)是一種事實(shí),當(dāng)函數(shù)可以記住并訪問所在的詞法作用域,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行,這時(shí)就產(chǎn)生了閉包。閉包產(chǎn)生之后能夠涵蓋它所能訪問的詞法作用域。
好啦,講完啦,如果大家覺得有錯(cuò)誤或者改進(jìn)的地方歡迎指出,只求共同進(jìn)步。?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84566.html
摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么。看到閉包在哪了嗎閉包到底是什么五年前,我也被這個(gè)問題困擾,于是去搜了并總結(jié)下來。關(guān)于閉包的謠言閉包會(huì)造成內(nèi)存泄露錯(cuò)。閉包里面的變量明明就是我們需要的變量,憑什么說是內(nèi)存泄露這個(gè)謠言是如何來的因?yàn)椤? 本文為饑人谷講師方方原創(chuàng)文章,首發(fā)于 前端學(xué)習(xí)指南。 大名鼎鼎的閉包!面試必問。請(qǐng)用自己的話簡(jiǎn)述 什么是「閉包」。 「閉包」的作用是什么。 首先...
摘要:事件去年奪冠,王思聰抽獎(jiǎng)。終于說到今天的正題了時(shí)間塔是什么它是一個(gè)區(qū)塊鏈量子隨機(jī)數(shù)發(fā)生器。簡(jiǎn)單地說,時(shí)間塔從鏈上抽取數(shù)據(jù),通過一系列高級(jí)操作,生成隨機(jī)數(shù)時(shí)間塔和有什么關(guān)系時(shí)間塔是聯(lián)合知名高校科研機(jī)構(gòu)以及實(shí)驗(yàn)室共同開發(fā)的科研成果。 以前我一直認(rèn)為,人類的本質(zhì)是復(fù)讀機(jī)。實(shí)際上,我還是過于年輕了,現(xiàn)實(shí)的冷水,終于澆醒了我。 人類的本質(zhì),是鴿子。 為什么?你聽我說。showImg(https:...
摘要:在一個(gè)閉包環(huán)境內(nèi)修改變量值,不會(huì)影響另一個(gè)閉包中的變量。直到看到函數(shù)閉包閉包這篇文章的代碼一部分,終于明白其中的邏輯了。 閉包 閉包定義:指擁有多個(gè)變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。函數(shù)內(nèi)部可以直接讀取全局變量。函數(shù)內(nèi)部變量無法在函數(shù)外部訪問。函數(shù)內(nèi)部聲明要用var或者let聲明,不然會(huì)變成全局變量鏈?zhǔn)阶饔糜颍鹤訉?duì)象會(huì)一級(jí)級(jí)向上尋找...
摘要:純分享直接上干貨操作系統(tǒng)并發(fā)支持進(jìn)程管理內(nèi)存管理文件系統(tǒng)系統(tǒng)進(jìn)程間通信網(wǎng)絡(luò)通信阻塞隊(duì)列數(shù)組有界隊(duì)列鏈表無界隊(duì)列優(yōu)先級(jí)有限無界隊(duì)列延時(shí)無界隊(duì)列同步隊(duì)列隊(duì)列內(nèi)存模型線程通信機(jī)制內(nèi)存共享消息傳遞內(nèi)存模型順序一致性指令重排序原則內(nèi)存語(yǔ)義線程 純分享 , 直接上干貨! 操作系統(tǒng)并發(fā)支持 進(jìn)程管理內(nèi)存管...
閱讀 1074·2021-11-16 11:45
閱讀 2708·2021-09-27 13:59
閱讀 1315·2021-08-31 09:38
閱讀 3143·2019-08-30 15:52
閱讀 1315·2019-08-29 13:46
閱讀 2085·2019-08-29 11:23
閱讀 1631·2019-08-26 13:47
閱讀 2476·2019-08-26 11:54