閉包在工作中的使用例子,這是面試官問我的,說實話,工作中我基本沒用過,但是我知道閉包的原理。說起使用場景,我還真不知道。求大神指點些例子。
使用閉包要么是為了訪問函數(shù)內(nèi)部的變量、要么是為了將一個變量保存在內(nèi)存中,或者保護函數(shù)內(nèi)部變量;
1、平時在我們封裝功能函數(shù)時,為了不讓全局變量混亂,污染全局作用域,這時候可以使用閉包代替全局變量(JQuery內(nèi)部的封裝就是如此);
2、還有常用的就是為了創(chuàng)建出類似塊級作用域(即為一個nodelist對象列表中的每一個元素綁定事件時);
3、高價函數(shù)的使用也是有所體現(xiàn)的。
…………平時我們使用閉包的方面還是比較多的,不知不覺中其實你就已經(jīng)創(chuàng)建了閉包
首先,可能題主把閉包看得太狹義了,有些常見模式其實也是閉包。不過,平心而論,以前典型的閉包用法(存狀態(tài))現(xiàn)在確實廢棄了。
閉包的定義是“函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合” MDN,換言之,就是帶著環(huán)境(上下文、狀態(tài)、屬性、局部變量,找一個你能理解的詞)的函數(shù)。從ES2015起,最簡單的閉包變成了這樣:
{
let localVar = 1;
whatever.onclick = () => localVar++;
}
whatever.onclick就是一個閉包,因為它帶著localVar。
從這個角度上來說,所有Javascript函數(shù)都是閉包,因為他們都能訪問到window下面的全局變量,如果傳遞給另一個框架的話,用的都是自帶的全局變量環(huán)境。
上面的閉包非常糟糕,糟糕就在于它不是純函數(shù),它是有狀態(tài)的。分散在各個閉包中的狀態(tài)會成為bug的溫床。以foo為例,每次調(diào)用都會有副作用,得到的值都不一樣,狀態(tài)在哪里又找不著(假設(shè)你忘了localVar是啥),給debug造成極大的困難。
現(xiàn)在主流的狀態(tài)管理框架Flux/Redux/Vuex的思想全都是集中狀態(tài)管理。還把狀態(tài)分散到一個一個閉包里面,是過時的。
那我們把狀態(tài)保存在哪里?this里。
雖然this也是JS的一個天坑,但是比起閉包來,簡直好太多了。this最偉大的功勛就在于函數(shù)和環(huán)境的解耦(跟閉包正好相反)。
let bar = function() { this.a++ }
let state = { a: 1, bar };
這個時候有同學(xué)就要問了,state.bar()還是有副作用的呀,得到的值還是不一樣,好處在哪?好處在于
bar前面是什么?是一個對象state,我們現(xiàn)在能確定bar的副作用在哪里了;bar本身沒有副作用,只要我們深拷貝state,我們就能歷史回放state.bar()是怎么出bug的。以上兩點簡直是debug的福音。
所以,React強推class,Vue用的也是this,都用對象存狀態(tài)。既然狀態(tài)都被對象存了,以前典型的閉包用法(存狀態(tài))自然就廢棄了。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。