摘要:之三關(guān)于閉包和遞歸開(kāi)篇這一期本來(lái)是打算寫閉包的,但是無(wú)意中看到高級(jí)程序設(shè)計(jì)中閉包的前一章就是遞歸。閉包練習(xí)題這個(gè)板塊會(huì)實(shí)時(shí)補(bǔ)充的關(guān)于遞歸其實(shí)說(shuō)到遞歸,主要就是要說(shuō)這個(gè)的用法,其實(shí)主要就是調(diào)用自己的外圍函數(shù),并且可以傳參。
之三:關(guān)于閉包和遞歸 1. 開(kāi)篇
這一期本來(lái)是打算寫閉包的,但是無(wú)意中看到《JavaScript高級(jí)程序設(shè)計(jì)》中閉包的前一章就是遞歸。
所以拿出來(lái)一起講一下吧!
我覺(jué)得閉包算是筆試面試中??嫉?,當(dāng)面試官問(wèn)道閉包的時(shí)候?;蛟S人人都會(huì)說(shuō)上:從表象上看,閉包是內(nèi)部函數(shù)引用外部函數(shù)的變量,導(dǎo)致內(nèi)部函數(shù)引用的變量不會(huì)被釋放。即使外部函數(shù)被銷毀時(shí),變量依然駐留在內(nèi)存中!
可是大家真的懂這句話的意思嗎(在深入了解之前,我也不明白)
今天就讓我們來(lái)好好了解一下:
先看一段代碼:
// 需求時(shí)是一秒鐘之后,在控制臺(tái)依此輸出1-10 function numberLog() { for (var i = 1;i <= 10;i++) { setTimeout(function () { console.log(i) }, 1000) } } numberLog();
大家覺(jué)得上面的代碼,能實(shí)現(xiàn)預(yù)期的需求嗎?
當(dāng)然不能,代碼的執(zhí)行速度很快,我們循環(huán)了十次,生成了十個(gè)setTimeout(function(){console.log(i)}, 1000),
然后當(dāng)一秒鐘過(guò)去了,i早就變成11了,所以最后就會(huì)輸出10個(gè)11
那么怎么改進(jìn)呢?
看這段代碼:
function numberLog() { for (var i = 1;i <= 10;i++) { (function (count) { setTimeout(function () { return console.log(count) }, 1000) })(i) } } numberLog();
這次再看一下,在控制臺(tái)上會(huì)輸出1-10
這是為什么?其實(shí)看不懂也沒(méi)有關(guān)系,就是簡(jiǎn)單的舉了一個(gè)閉包的應(yīng)用場(chǎng)景。
下面具體說(shuō)一下,只需要記住以下幾點(diǎn):
當(dāng)一個(gè)函數(shù)執(zhí)行時(shí),全局會(huì)為這個(gè)函數(shù)做兩件事:1.構(gòu)建一個(gè)獨(dú)立的函數(shù)環(huán)境 2.把全局的變量用作用域鏈的形式推給這個(gè)函數(shù),換句簡(jiǎn)單的話說(shuō)就是讓這個(gè)函數(shù)可以訪問(wèn)到它外層定義的變量,并可以一層一層的向外引用
如果一個(gè)函數(shù)里面嵌套了一個(gè)函數(shù),并且這個(gè)內(nèi)部函數(shù)引用外層函數(shù)的變量,那個(gè)這個(gè)變量就不能在外層函數(shù)結(jié)束后被釋放(正常是函數(shù)調(diào)用完,環(huán)境和變量就都會(huì)被釋放),因?yàn)椴恢纼?nèi)部函數(shù)在什么時(shí)候就會(huì)被調(diào)用。
那上面這個(gè)例子是怎么回事呢?
我們可以看到在循環(huán)代碼內(nèi)我們執(zhí)行了一個(gè)函數(shù)立即調(diào)用,并且返回一個(gè)console.log(XX)
由于立即調(diào)用的這個(gè)函數(shù)引用了外部函數(shù)numberLog的變量i,因此i從1-10都不會(huì)被釋放,都會(huì)在內(nèi)部形成一個(gè)閉包空間。
當(dāng)一秒鐘過(guò)去,還是會(huì)打印出 1-10
不知道這么說(shuō),你明白沒(méi)有,不太懂的話請(qǐng)看書(shū)《JavaScript高級(jí)程序設(shè)計(jì)》第七章閉包那一節(jié)。
3. 閉包練習(xí)題4. 關(guān)于遞歸這個(gè)板塊會(huì)實(shí)時(shí)補(bǔ)充的
其實(shí)說(shuō)到遞歸,主要就是要說(shuō)callee這個(gè)的用法,callee其實(shí)主要就是調(diào)用自己的外圍函數(shù),并且可以傳參。
下面我們來(lái)看一個(gè)題(我面試百度時(shí)的題):
// 用setTimeout來(lái)模擬setInterval
先留個(gè)懸念哈!
5. 最后今天是周日,下周會(huì)有一個(gè)百度糯米的面試!現(xiàn)在感覺(jué)自己的js的基礎(chǔ)有些薄弱,
所以下一節(jié)會(huì)說(shuō)一下js原生的dom操作,一起加油喲!
歡迎大家指出不足和意見(jiàn),我會(huì)虛心接受
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/80122.html
摘要:忍者級(jí)別的函數(shù)操作對(duì)于什么是匿名函數(shù),這里就不做過(guò)多介紹了。我們需要知道的是,對(duì)于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...
摘要:插件開(kāi)發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實(shí)現(xiàn)文件分片斷點(diǎn)續(xù)傳。 Vue.js 插件開(kāi)發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。插....
摘要:兩日前,發(fā)了一篇吐槽,莫名的火了一把。關(guān)于的第一個(gè),其實(shí)就是聲明一個(gè)常量,不允許變更。另外對(duì)象迭代這里出自,阮一峰大神寫的入門指南,對(duì)象篇。 兩日前,發(fā)了一篇吐槽,莫名的火了一把。經(jīng)過(guò)大家的建議與鼓勵(lì),于是修改了簡(jiǎn)歷,開(kāi)始了重新投遞,2天后接到第一份面試邀請(qǐng)。 此文為個(gè)人面試經(jīng)歷,QA問(wèn)答過(guò)程與總結(jié),不透露面試公司及面試人員,內(nèi)容真實(shí),如果有面試過(guò)我的大佬看到博客,歡迎指出問(wèn)題。 循序...
摘要:難怪超過(guò)三分之一的開(kāi)發(fā)人員工作需要一些知識(shí)。但是隨著行業(yè)的飽和,初中級(jí)前端就業(yè)形勢(shì)不容樂(lè)觀。整個(gè)系列的文章大概有篇左右,從我是如何成為一個(gè)前端工程師,到各種前端框架的知識(shí)。 為什么 call 比 apply 快? 這是一個(gè)非常有意思的問(wèn)題。 作者會(huì)在參數(shù)為3個(gè)(包含3)以內(nèi)時(shí),優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過(guò)多(多余3個(gè))時(shí),才考慮使用 apply 方法。 這個(gè)的原因...
閱讀 1200·2021-11-24 09:38
閱讀 3310·2021-11-19 09:56
閱讀 3020·2021-11-18 10:02
閱讀 793·2019-08-29 12:50
閱讀 2614·2019-08-28 18:30
閱讀 921·2019-08-28 18:10
閱讀 3757·2019-08-26 11:36
閱讀 2707·2019-08-23 18:23