javascript 閉包

1.什么是閉包形庭?

? ??????????閉包是指有權(quán)訪問另一個函數(shù)作用域的變量的函數(shù)

????????????說白了厌漂,閉包就是一個函數(shù)萨醒,這個函數(shù)能夠訪問其他函數(shù)的作用域中的私有變量。每當創(chuàng)建一個函數(shù)苇倡,閉包就會在函數(shù)創(chuàng)建的同時被創(chuàng)建出來富纸。

2.我們都知道函數(shù)內(nèi)部可以訪問全局變量的,但還是內(nèi)部的變量外部訪問不到

????????function?fun?(){

????????????str='沒有用var'

????????????var?num=1

????????}

????????fun()//得調(diào)fun函數(shù)旨椒,如果不調(diào)str訪問不到晓褪,相當于全局只有fun

????????console.log(str,'str')//沒有用var?str-----(:如果不用var聲明變量的話,實際上聲明了一個全局變量)

????????console.log(num,'num')//num?is?not?defined

3.外部如何才能拿到局部變量

????????function?fun1?(){

????????????var?str1='fun1--str'

????????????function?fun2(){

????????????????var?str2='fun2-str'

????????????????console.log(str1)//str1---可以拿到父級作用域的變量

????????????}

????????????console.log(str2)//不可以訪問fun2子函數(shù)中的str2變量

????????}

????????????在上面的代碼中综慎,fun1里面的變量fun2可以拿到涣仿,但fun2里面的變量fun1不可以拿到。這就是鏈式的作用域寥粹。子對象可以一層一層的向上找父級中的變量变过,父級里面的所有變量子都可以拿到埃元,但父級拿不到子函數(shù)作用域中的變量。

????????????1>如果我們想要獲取fun1中的變量怎么獲取呢媚狰?把fun2作為返回值

? ??????????????function?fun1(){

????????????????????var?str1='str1變量'

????????????????????return?function?fun2(){

? ? ? ? ? ? ? ? ? ? ????console.log(str1,'fun2中打印父級中的變量str1')

????????????????????}

????????????????}

? ? ? ? ? ? ? ?fun1()()//這里的fun1()調(diào)用返回的是fun2岛杀,fun1()()調(diào)用fun()的返回值fun2

????????????????上面的例子中返回的fun2就是閉包

? ? ? ? ? ? ? ? 注意:不管return不return? ? fun2都是閉包,表示一種狀態(tài)崭孤,子函數(shù)可以訪問父函數(shù)的變量类嗤,形成的語法環(huán)境組合


4.這些變量的值始終保存在內(nèi)存中

????????????????????function?fun1(){

?????????????????????????var?num=1

?????????????????????????return?function?fun2(){

?????????????????????????????num++

?????????????????????????????console.log(num,'num')

?????????????????????????}

?????????????????????}

?????????????????????let?result=fun1()

?????????????????????result()//2?"num"

?????????????????????result()//3?"num"

?????????????????????fun1()()//2?"num",因為---每調(diào)一次fun1開辟一個新環(huán)境

? ? ? ? ? ? ? ? ????上面之所以num編程6是因為,num并沒有因fun1的調(diào)用被回收辨宠,而是一直在內(nèi)存中

? ? ? ? ? ? ? ? ? ? ?因為fun1是fun2的父函數(shù)遗锣,而fun2被賦給了一個全局變量,這導致fun2始終在內(nèi)存中嗤形,而fun2的存在依賴于fun1精偿,因此fun1也始終在內(nèi)存中,不會在調(diào)用結(jié)束后赋兵,被垃圾回收機制(garbage collection)回收笔咽。

5.缺點

?由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大霹期,所以不能濫用閉包叶组,否則會造成網(wǎng)頁的性能問題,在IE中可能導致內(nèi)存泄露历造。解決方法是甩十,在退出函數(shù)之前,將不使用的局部變量全部刪除吭产。

請大家慎用侣监。

6.this問題解決的兩種方式

? ? ? ? 以構(gòu)造函數(shù)為例

? ? ? ? 1>手動賦值this

????????function?Fun(){

????????????this.str='222'

????????????this.fun2?=?function(){

????????????????let?self?=?this

????????????????return?function(){

? ? ? ? ? ? ? ? ? ? //這個閉包函數(shù)this指向是window

????????????????????console.log(self.str,'this.str')

????????????????}

????????????}

????????}

????????let?f1 =new?Fun()

? ? ? ? 2>ES6箭頭函數(shù)

? ??????????function?Fun(){

????????????????this.str='222'

????????????????let?str1=1

????????????????this.fun2?=?function(){

????????????????????return?()=>{

????????????????????????console.log(this.str,'this.str')

????????????????????}

????????????????}

???????????}

????????????let?f1 =new?Fun()

? ? ? ? ? ?再舉一個例子:

? ? ? ? ? ? ?這個例子,跟上面構(gòu)造函數(shù)的例子差不多垮刹。

? ? ? ? ? ? ?至于圖中為什么用let訪問不到全局變量中的str达吞。那是因為用 let 和 const 聲明的全局變量并沒有在全局對象(window)中,只是一個塊級作用域(Script)中荒典。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吞鸭,隨后出現(xiàn)的幾起案子寺董,更是在濱河造成了極大的恐慌,老刑警劉巖刻剥,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遮咖,死亡現(xiàn)場離奇詭異,居然都是意外死亡造虏,警方通過查閱死者的電腦和手機御吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門麦箍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陶珠,你說我怎么就攤上這事挟裂。” “怎么了揍诽?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵诀蓉,是天一觀的道長。 經(jīng)常有香客問我暑脆,道長渠啤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任添吗,我火速辦了婚禮沥曹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碟联。我一直安慰自己妓美,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布玄帕。 她就那樣靜靜地躺著部脚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪裤纹。 梳的紋絲不亂的頭發(fā)上委刘,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音鹰椒,去河邊找鬼锡移。 笑死,一個胖子當著我的面吹牛漆际,可吹牛的內(nèi)容都是我干的淆珊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼奸汇,長吁一口氣:“原來是場噩夢啊……” “哼施符!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起擂找,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戳吝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贯涎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體听哭,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陆盘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片普筹。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隘马,靈堂內(nèi)的尸體忽然破棺而出太防,到底是詐尸還是另有隱情,我是刑警寧澤祟霍,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布杏头,位于F島的核電站,受9級特大地震影響沸呐,放射性物質(zhì)發(fā)生泄漏醇王。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一崭添、第九天 我趴在偏房一處隱蔽的房頂上張望寓娩。 院中可真熱鬧,春花似錦呼渣、人聲如沸棘伴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焊夸。三九已至,卻和暖如春蓝角,著一層夾襖步出監(jiān)牢的瞬間阱穗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工使鹅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揪阶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓患朱,卻偏偏與公主長得像鲁僚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裁厅,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 閉包是javascript(以下簡稱js)中比較難以理解的重要知識點之一冰沙,能否理解閉包甚至可以決定你是否能夠?qū)懗龈?..
    JYoung閱讀 249評論 0 1
  • 閉包的概念比較抽象,理解起來比較困難执虹,但是仔細分析一下其實也沒有特別恐怖倦淀,面向?qū)ο蟮母拍疃几愣诉@又算啥呢 定義:...
    Rz______閱讀 187評論 0 0
  • 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請自行忽略声畏。 譯者...
    KX九五閱讀 278評論 0 1
  • 如果要了解閉包,我們需要先了解閉包的由來,閉包的產(chǎn)生插龄,源于JS的詞法作用域 詞法作用域 作用域是指一個 變量能夠訪...
    羊烊羴閱讀 239評論 0 2
  • 一愿棋、閉包有什么用 1、能夠在函數(shù)外部引用函數(shù)內(nèi)部的變量(變量作用域)均牢; 2糠雨、讓變量的值始終保持在內(nèi)存中(垃圾回收機...
    你這個人真的是閱讀 357評論 0 1