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

資訊專欄INFORMATION COLUMN

多層級理解閉包

nemo / 3526人閱讀

摘要:第二梯隊理解有了第一梯隊的認識,我們慢慢修正大腦中對閉包的認識。理解這句話就可以很好的與閉包這兩個字關聯起來理解閉包這個概念了。總結第二梯隊理解閉包是一個有特定功能的函數。第四梯隊理解閉包通過訪問外部變量,一個閉包可以維持這些變量。

閉包

閉包的概念困惑了我很久,記得當時我面試的時候最后一面有一個問題就是問題關于閉包的問題,然而到現在已經完全不記得當時的題目是啥了,但仍然能夠回憶起當時不會的feel,雖然面試官非常友好的提醒了我應該用閉包,可是在我吭哧半天出不來的情況下,迷面試官還是耐心的給我講了什么是閉包:有一個函數處理之后返回另一個函數,且只能執行一次。然后給我把當時的題寫了一下,直到我出來都沒有理解什么是閉包,那個題到底是什么題,要不是其他都答出來的話,估計都要掛。哎~一個菜鳥的心路歷程。于是,閉包就成了我心里的梗。

今天憑借自己的理解,解釋下什么是閉包。不免會參考網上各類大神的文章,各位看到請見諒。

閉包的理解是需要一個循序漸進的過程,下面我也會循序漸進從各個角度來闡述對閉包的不同理解,以便方便大家深度理解閉包。

第一梯隊理解

我個人認為閉包之所以難以理解很重要的一點在于,很多概念我們在理解的過程中都會在潛意識里和這個概念本身的名詞強度關聯在一起在揣摩這個概念的意思,如果自己的理解和這個名詞本身的字面意思看上去不那么相關的話,就會在內心產生巨大的懷疑感,不敢相信自己的理解是否正確,哪怕是正確的。所以在立即一個概念本身的含義過程中需要一個步驟就是將自己對概念的理解和名詞本身找到某種莫名的連接方法就好理解了。

閉包這個名詞換做誰聽上去都不知道是在說什么,這本身就給理解這個概念造成了很大的困惑,因為一個通俗易懂的代名詞就可以很好地解釋一個概念的50%了。比如變量就是變化的字面量,條件語句分支語句大家一聽就很好理解其概念是什么。所以首先大家需要在概念上給閉包建立一個初級的感性認識。一下這句話是我見到的簡單易懂的一種解釋。

functions that return functions

意思是:閉包就是一個函數,只不過這個函數是另一個函數的返回值。

沒錯,最表面上看似乎就是這樣的。比如寫一個閉包:

  function fn1() {
       var temp = 10;
       return function() {
           console.log(++temp);
       }
  }
  fn1()();

上面的例子里return出來的那個function就是一個非常簡單的閉包,表面上看和上面的定義語句差不多就是一個從函數里返回的函數。

第一梯隊的理解到這接差不多了,雖然不正確,雖然很粗糙,但對形成一個感性認識應該是夠了,總結一個第一梯隊的認識,什么是閉包:

一個函數

被其他函數return出來的函數。

這個時候認識里面應該有這么一個概念,就是閉包和我們已經理解的一個概念應該差不多,那就是函數,沒錯剛開始就可以這么理解,閉包就是一個函數,是一個特殊的函數,就好像js中的方法也是函數一樣。

第二梯隊理解

有了第一梯隊的認識,我們慢慢修正大腦中對閉包的認識。
有的人理解閉包就是一個嵌套在函數里的函數,內部函數可以訪問外部函數的數據而已。這么理解是不對的。看下面這段代碼:

function fn1() {
  var temp = 10;
  function fn2() {
      console.log(++temp);
  }
  fn2()
}
fn1()

可是這時的fn1()無論執行多少次打印都是11,永遠不會變,所以這還不是閉包,只有當你return出來一個內部function的時候才會形成一個閉包,閉包就是return出來的這個函數。這個內部函數可以close-over外部函數的變量直到內部的這個函數(閉包)結束掉。

這時我們再來看看第一梯隊中的代碼

  function fn1() {
       var temp = 10;
       return function() {
           console.log(++temp);
       }
  }
  vat func1 = fn1(); // func1就是一個閉包(就是fn1返回的函數)。
  func1(); // 打印11
  func1(); // 打印12

這個時候func1是全局變量,但是打印的時候卻訪問的是fn1的局部變量temp并且,當fn1()函數執行完之后,temp的變量并沒有被垃圾回收到仍然存在于內存中,這就是閉包的特點。也就是剛剛我們說的內部函數close-over外部函數的變量。理解這句話就可以很好的與閉包這兩個字關聯起來理解閉包這個概念了。

總結第二梯隊理解:

閉包是一個有特定功能的函數。他是一個可以讀取其他函數內部變量的一個函數。

因為在javascript中如果你想讀取一個函數內的變量(通常稱為局部變量)只有函數的子函數可以訪問。

那么將這兩個概念交叉理解,就可以簡單的理解閉包就是一個定義在函數內部的函數,且可以訪問函數里的局部變量的那個函數。

在沒有閉包,我們沒法訪問函數內部的局部變量,有了閉包之后,我們就可以訪問函數內部的局部變量了,等同于閉包解決了一個問題,那就是在函數內部和函數外部之間建立了一座橋梁。

第三梯隊理解

這個時候我們可以看看官方定義的閉包:閉包是指那些能夠訪問獨立(自由)變量的函數 (變量在本地使用,但定義在一個封閉的作用域中)。換句話說,這些函數可以“記憶”它被創建時候的環境。

再看另一個定義:
那么什么是閉包呢?這里有兩個定義。在計算機科學中(而不是數學中),一個閉包是一個函數或者一個函數的引用,以及他們所引用的環境信息(就像是一個表,這個表存儲了這個函數中引用的每一個沒有在函數內聲明的變量)。

這兩個定義中都有一個概念,第一個里“封閉的作用域”,第二個里“所引用的環境信息”。這里我們都可以用上面的close-over外部函數的變量暫時理解。

也就是閉包總是要有兩個部分的:

一部分是一個函數。

另一個部分是被這個函數“包住”的(有的理解為“帶走”的,或者是close-over住的)一些環境信息(可以理解環境信息就是變量),但是卻不在這個函數中聲明的變量表(稱之為free variables或者outer variables)。

還有一個不是那么呆的定義:閉包允許你封裝一些行為(函數就是行為),像其他對象一樣將它傳來傳去(函數是first-class function),但是不論怎樣,它仍然保持著對原來最初上下文的訪問能力(它還能訪問到 outer variables)。

這個時候的理解就比較抽象了,因為又涉及到作用域的概念,又是一個封閉的作用域。其實上面括號中有一段話(就像是一個表,這個表存儲了這個函數中引用的每一個沒有在函數內聲明的變量),這個表就是在定義這個閉包的“閉”的范圍有哪些。

第四梯隊理解

閉包通過訪問外部變量,一個閉包可以維持(keep alive)這些變量。在內部函數和外部函數的例子中,外部函數可以創建局部變量,并且最終退出;但是,如果任何一個或多個內部函數在它退出后卻沒有退出,那么內部函數就維持了外部函數的局部數據。

從技術上來講,在JS中,每個function都是閉包,因為它總是能訪問在它外部定義的數據。

目前我的水平也就理解到這里了,希望給大家有所幫助。

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

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

相關文章

  • 【Step-By-Step】高頻面試題深入解析 / 周刊04

    摘要:關于點擊進入項目是我于開始的一個項目,每個工作日發布一道面試題。的狀態由決定,分成以下兩種情況只有的狀態都變成,的狀態才會變成,此時的返回值組成一個數組,傳遞給的回調函數。 關于【Step-By-Step】 Step-By-Step (點擊進入項目) 是我于 2019-05-20 開始的一個項目,每個工作日發布一道面試題。每個周末我會仔細閱讀大家的答案,整理最一份較優答案出來,因本人...

    youkede 評論0 收藏0
  • 企業服務的“多租戶多層”模式

    摘要:相信在分級分權的時代訴求下,聆客企業服務的多租戶多層級模式將大有可為。 聆客企業協作平臺(BingoLink,下簡稱聆客)是品高云旗下面向生態型組織的云端協作與開放平臺產品。聆客作為SaaS化的企業協作移動平臺,在當前在云計算時代的公私混合架構下,各企業客戶以獨立租戶模式存在于平臺之上,使用個性化的系統,業務數據相互獨立隔離、獨立管理。 但對于大型集團企業而言,集團總部與旗下子公司存在...

    lijinke666 評論0 收藏0
  • javascript系列--javascript深入理解--作用域,作用域鏈,閉包的面試題解

    摘要:一概要作用域和作用域鏈是中非常重要的特性,關系到理解整個體系,閉包是對作用域的延伸,其他語言也有閉包的特性。作用域鏈的作用他保證了變量對象的有序訪問。 一、概要 作用域和作用域鏈是js中非常重要的特性,關系到理解整個js體系,閉包是對作用域的延伸,其他語言也有閉包的特性。 那什么是作用域?作用域指的是一個變量和函數的作用范圍。 1、js中函數內聲明的所有變量在函數體內始終是可見的; 2...

    anRui 評論0 收藏0
  • JavaScript中的閉包

    摘要:閉包引起的內存泄漏總結從理論的角度將由于作用域鏈的特性中所有函數都是閉包但是從應用的角度來說只有當函數以返回值返回或者當函數以參數形式使用或者當函數中自由變量在函數外被引用時才能成為明確意義上的閉包。 文章同步到github js的閉包概念幾乎是任何面試官都會問的問題,最近把閉包這塊的概念梳理了一下,記錄成以下文章。 什么是閉包 我先列出一些官方及經典書籍等書中給出的概念,這些概念雖然...

    HmyBmny 評論0 收藏0

發表評論

0條評論

nemo

|高級講師

TA的文章

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