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