国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【面試系列】之三:關于閉包和遞歸

2501207950 / 611人閱讀

摘要:之三關于閉包和遞歸開篇這一期本來是打算寫閉包的,但是無意中看到高級程序設計中閉包的前一章就是遞歸。閉包練習題這個板塊會實時補充的關于遞歸其實說到遞歸,主要就是要說這個的用法,其實主要就是調用自己的外圍函數,并且可以傳參。

之三:關于閉包和遞歸 1. 開篇

這一期本來是打算寫閉包的,但是無意中看到《JavaScript高級程序設計》中閉包的前一章就是遞歸。
所以拿出來一起講一下吧!

我覺得閉包算是筆試面試中常考的,當面試官問道閉包的時候。或許人人都會說上:從表象上看,閉包是內部函數引用外部函數的變量,導致內部函數引用的變量不會被釋放。即使外部函數被銷毀時,變量依然駐留在內存中!
可是大家真的懂這句話的意思嗎(在深入了解之前,我也不明白)
今天就讓我們來好好了解一下:

2. 閉包的原理

先看一段代碼:

// 需求時是一秒鐘之后,在控制臺依此輸出1-10
function numberLog() {
    for (var i = 1;i <= 10;i++) {
        setTimeout(function () {
            console.log(i)
        }, 1000)
    }
}
numberLog();

大家覺得上面的代碼,能實現預期的需求嗎?
當然不能,代碼的執行速度很快,我們循環了十次,生成了十個setTimeout(function(){console.log(i)}, 1000)
然后當一秒鐘過去了,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
這是為什么?其實看不懂也沒有關系,就是簡單的舉了一個閉包的應用場景。

下面具體說一下,只需要記住以下幾點:

當一個函數執行時,全局會為這個函數做兩件事:1.構建一個獨立的函數環境 2.把全局的變量用作用域鏈的形式推給這個函數,換句簡單的話說就是讓這個函數可以訪問到它外層定義的變量,并可以一層一層的向外引用

如果一個函數里面嵌套了一個函數,并且這個內部函數引用外層函數的變量,那個這個變量就不能在外層函數結束后被釋放(正常是函數調用完,環境和變量就都會被釋放),因為不知道內部函數在什么時候就會被調用。

那上面這個例子是怎么回事呢?
我們可以看到在循環代碼內我們執行了一個函數立即調用,并且返回一個console.log(XX)
由于立即調用的這個函數引用了外部函數numberLog的變量i,因此i從1-10都不會被釋放,都會在內部形成一個閉包空間。
當一秒鐘過去,還是會打印出 1-10

不知道這么說,你明白沒有,不太懂的話請看書《JavaScript高級程序設計》第七章閉包那一節。

3. 閉包練習題

這個板塊會實時補充的

4. 關于遞歸

其實說到遞歸,主要就是要說callee這個的用法,callee其實主要就是調用自己的外圍函數,并且可以傳參。
下面我們來看一個題(我面試百度時的題):

// 用setTimeout來模擬setInterval

先留個懸念哈!

5. 最后

今天是周日,下周會有一個百度糯米的面試!現在感覺自己的js的基礎有些薄弱,
所以下一節會說一下js原生的dom操作,一起加油喲!

歡迎大家指出不足和意見,我會虛心接受

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80122.html

相關文章

  • JavasScript重難點知識

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

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

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

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

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

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

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

    Lowky 評論0 收藏0

發表評論

0條評論

2501207950

|高級講師

TA的文章

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