成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

面試官問我:什么是JavaScript閉包,我該如何回答

BenCHou / 3652人閱讀

摘要:到底什么是閉包這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結(jié)束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。

閉包,有人說它是一種設(shè)計理念,有人說所有的函數(shù)都是閉包。到底什么是閉包?這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。
這個問題也有很多朋友在公眾號給李老師留言了,問題表達方式不一樣,都是終歸到一點,就是對閉包沒有很清晰的理解。大家經(jīng)常去網(wǎng)上找相關(guān)資料,但是對閉包的說法都是各種各樣的,讓大家對閉包的定義沒有一個概念。
所以今天我們來一起講講什么是閉包,幫助大家理解,今天的內(nèi)容可以直接收藏起來。方便以后看。

什么是閉包(Closure)

簡單講,閉包就是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。
MDN 上面這么說:閉包是一種特殊的對象。
它由兩部分構(gòu)成:函數(shù),以及創(chuàng)建該函數(shù)的環(huán)境。環(huán)境由閉包創(chuàng)建時在作用域中的任何局部變量組成。

這種官方的概念是比較難理解的,在面試的時候說出來也不是很專業(yè),因為沒辦法有個具體的邏輯。
我個人認為,理解閉包的關(guān)鍵在于:外部函數(shù)調(diào)用之后其變量對象本應該被銷毀,但閉包的存在使我們?nèi)匀豢梢栽L問外部函數(shù)的變量對象,這就是閉包的重要概念。

產(chǎn)生一個閉包

創(chuàng)建閉包最常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。下面例子中的 closure 就是一個閉包:

閉包的作用域鏈包含著它自己的作用域,以及包含它的函數(shù)的作用域和全局作用域。

閉包的注意事項

.通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結(jié)束后被銷毀。但是,在創(chuàng)建了一個閉包以后,這個函數(shù)的作用域就會一直保存到閉包不存在為止。

從上述代碼可以看到add5 和 add10 都是閉包。它們共享相同的函數(shù)定義,但是保存了不同的環(huán)境。在 add5 的環(huán)境中,x 為 5。而在 add10 中,x 則為 10。最后通過 null 釋放了 add5 和 add10 對閉包的引用。
在javascript中,如果一個對象不再被引用,那么這個對象就會被垃圾回收機制回收;
如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。

閉包只能取得包含函數(shù)中任何變量的最后一個值

大家看一下上面這個代碼,arr數(shù)組中包含了10個匿名函數(shù),每個匿名函數(shù)都能訪問外部函數(shù)的變量i,那么i是多少呢?
當arrFunc執(zhí)行完畢后,其作用域被銷毀,但它的變量對象仍保存在內(nèi)存中,得以被匿名訪問,這時i的值為10。
要想保存在循環(huán)過程中每一個i的值,需要在匿名函數(shù)外部再套用一個匿名函數(shù),在這個匿名函數(shù)中定義另一個變量并且立即執(zhí)行來保存i的值。

這時最內(nèi)部的匿名函數(shù)訪問的是num的值,所以數(shù)組中10個匿名函數(shù)的返回值就是1-10。

閉包中的this對象


在上面這段代碼中,obj.getName()()實際上是在全局作用域中調(diào)用了匿名函數(shù),this指向了window。
這里要理解函數(shù)名與函數(shù)功能是分割開的,不要認為函數(shù)在哪里,其內(nèi)部的this就指向哪里。
window才是匿名函數(shù)功能執(zhí)行的環(huán)境。
如果想使this指向外部函數(shù)的執(zhí)行環(huán)境,可以這樣改寫:

在閉包中,arguments與this也有相同的問題。下面的情況也要注意:

obj.getName();這時getName()是在對象obj的環(huán)境中執(zhí)行的,所以this指向obj。
(obj.getName = obj.getName)賦值語句返回的是等號右邊的值,在全局作用域中返回,所以(obj.getName = obj.getName)();的this指向全局。要把函數(shù)名和函數(shù)功能分割開來。

內(nèi)存泄漏

閉包會引用包含函數(shù)的整個變量對象,如果閉包的作用域鏈中保存著一個HTML元素,那么就意味著該元素無法被銷毀。所以我們有必要在對這個元素操作完之后主動銷毀。

函數(shù)內(nèi)部的定時器

當函數(shù)內(nèi)部的定時器引用了外部函數(shù)的變量對象時,該變量對象不會被銷毀。

閉包的應用

應用閉包的主要場合是:設(shè)計私有的方法和變量。
任何在函數(shù)中定義的變量,都可以認為是私有變量,因為不能在函數(shù)外部訪問這些變量。私有變量包括函數(shù)的參數(shù)、局部變量和函數(shù)內(nèi)定義的其他函數(shù)。
把有權(quán)訪問私有變量的公有方法稱為特權(quán)方法(privileged method)。

在這里,我們需要理解兩個概念:
模塊模式(The Module Pattern):為單例創(chuàng)建私有變量和方法。
單例(singleton):指的是只有一個實例的對象。JavaScript 一般以對象字面量的方式來創(chuàng)建一個單例對象。

上面是普通模式創(chuàng)建的單例,下面使用模塊模式創(chuàng)建單例:

匿名函數(shù)最大的用途是創(chuàng)建閉包,并且還可以構(gòu)建命名空間,以減少全局變量的使用。從而使用閉包模塊化代碼,減少全局變量的污染。

在這段代碼中函數(shù) addEvent 和 removeEvent 都是局部變量,但我們可以通過全局變量 objEvent 使用它,這就大大減少了全局變量的使用,增強了網(wǎng)頁的安全性。

運用閉包的關(guān)鍵

閉包引用外部函數(shù)變量對象中的值;
在外部函數(shù)的外部調(diào)用閉包。
閉包的缺陷
閉包的缺點就是常駐內(nèi)存會增大內(nèi)存使用量,并且使用不當很容易造成內(nèi)存泄露。
如果不是因為某些特殊任務而需要閉包,在沒有必要的情況下,在其它函數(shù)中創(chuàng)建函數(shù)是不明智的,因為閉包對腳本性能具有負面影響,包括處理速度和內(nèi)存消耗。
最后 來一道有關(guān)閉包的面試題
下面代碼中,標記 ? 的地方輸出分別是什么?

大家結(jié)合今天講解的內(nèi)容,思考一下答案,大家可以把答案發(fā)到留意上吧。

好了,今天的講解就那么多,如果你還有什么前端問題想提問的,或者你想李老師下次給大家講什么內(nèi)容,可以直接留意提問,說不定下次文章就會講解了。
如果你覺得這篇文章對你有幫助,請轉(zhuǎn)發(fā)點贊支持一下!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101863.html

相關(guān)文章

  • 面試小結(jié)--前端面試的幾個雷點

    摘要:前言得益于金三銀四,在最近一段時間,面試了一些人,但是符合的寥寥無幾??吹轿业拿嬖囶}自己寫的面試題,自己想的答案。聽人說過一個面試套路面試官問的問題,可能面試官自己都不懂,目的只是為了壓工資,挫士氣。不過我是為了測試面試者是不是真的精通。 技術(shù)在不斷的創(chuàng)新,隨著框架,庫,構(gòu)建工具,打包工具,版本控制工具等操作越來越方便,使用越來越簡單。面對這樣的情況,除了興奮,也要警惕。這些工具使得開...

    idealcn 評論0 收藏0
  • 簡歷上的項目經(jīng)歷怎么寫 ?這 3 條原則不可忽視 !

    摘要:正因為如此,現(xiàn)在很多簡歷上的項目經(jīng)歷的質(zhì)量都是參差不齊,同時有的項目經(jīng)歷又非常相似,面試官一眼就能知道你的項目到底是真是假。雖然以上三點原則不能包治百病,但是對很多同學來說應該是蠻有益處的。閱讀本文大概需要 5 分鐘。作者:黃小斜showImg(https://user-gold-cdn.xitu.io/2019/3/30/169cdb4bd2cac24c);?作為一個程序員,想必大家曾經(jīng)都...

    fobnn 評論0 收藏0
  • 2017暑期實習面試總結(jié)(前端方向)

    摘要:的暑期實習面試到現(xiàn)在差不多都結(jié)束了,算下來自己也投了十幾家簡歷,經(jīng)歷的差不多十場筆試,現(xiàn)場和電話面試也差不多有五六家公司。阿里三面三面不知道是不是交叉面,不過這次面試面試官說他是北京的之前都是杭州。 2017的暑期實習面試到現(xiàn)在差不多都結(jié)束了,算下來自己也投了十幾家簡歷,經(jīng)歷的差不多十場筆試,現(xiàn)場和電話面試也差不多有五六家公司。雖然最后只拿到兩個offer,所幸是自己期待的公司,下面從...

    worldligang 評論0 收藏0
  • 拒信收割機の前端面經(jīng)(CVTE,唯品會,百度)

    摘要:另外回答的時候要淡定,一些問題就算不懂也不能慌,要和面試官談笑風生,然后盡量扯回到自己懂的東西上面大公司比如百度給我的感覺就是很重視基礎(chǔ)思維和潛力。 —— 雖然我的offer少,但是我的拒信多啊 這幾天終于閑下來,做一點微小的工作,整理了一些之前幾家公司的前端面試題和個人經(jīng)驗,想做前端的師弟妹可以參考,也歡迎各同行大神來指教~ (以下問題不分先后,時間久遠難免有些遺漏;很多問題面試官都...

    yzd 評論0 收藏0

發(fā)表評論

0條評論

BenCHou

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<