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

資訊專欄INFORMATION COLUMN

【面試系列】之三:關(guān)于閉包和遞歸

2501207950 / 621人閱讀

摘要:之三關(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)存中!
可是大家真的懂這句話的意思嗎(在深入了解之前,我也不明白)
今天就讓我們來好好了解一下:

2. 閉包的原理

先看一段代碼:

// 需求時是一秒鐘之后,在控制臺依此輸出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

相關(guān)文章

  • JavasScript重難點知識

    摘要:忍者級別的函數(shù)操作對于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數(shù)是一個很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機制,如果...

    forsigner 評論0 收藏0
  • JavaScript - 收藏集 - 掘金

    摘要:插件開發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強大而且簡單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實現(xiàn)文件分片斷點續(xù)傳。 Vue.js 插件開發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強大而且簡單的方式。插....

    izhuhaodev 評論0 收藏0
  • 關(guān)于個人第一天前端面試面試問答QA,希望能對其他找前端工作的朋友有所幫助。

    摘要:兩日前,發(fā)了一篇吐槽,莫名的火了一把。關(guān)于的第一個,其實就是聲明一個常量,不允許變更。另外對象迭代這里出自,阮一峰大神寫的入門指南,對象篇。 兩日前,發(fā)了一篇吐槽,莫名的火了一把。經(jīng)過大家的建議與鼓勵,于是修改了簡歷,開始了重新投遞,2天后接到第一份面試邀請。 此文為個人面試經(jīng)歷,QA問答過程與總結(jié),不透露面試公司及面試人員,內(nèi)容真實,如果有面試過我的大佬看到博客,歡迎指出問題。 循序...

    Youngdze 評論0 收藏0
  • 前端知識點整理

    摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識。但是隨著行業(yè)的飽和,初中級前端就業(yè)形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數(shù)為3個(包含3)以內(nèi)時,優(yōu)先使用 call 方法進行事件的處理。而當(dāng)參數(shù)過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

    Lowky 評論0 收藏0

發(fā)表評論

0條評論

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