亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

你不知道的閉包

wwq0327 / 1357人閱讀

摘要:前言這篇文章不是全面講閉包知識的,而是針對那些已經(jīng)對閉包有所了解但是還存在疑惑的人群。那么為什么能保存在函數(shù)變量里面的呢實現(xiàn)閉包閉包函數(shù)定義時的作用域鏈到函數(shù)執(zhí)行時仍然有效。

前言

這篇文章不是全面講閉包知識的,而是針對那些已經(jīng)對閉包有所了解但是還存在疑惑的人群。比如:閉包為何能保存變量?接下來就詳細講述此類問題。以下內(nèi)容來自犀牛書第六版。

正文 經(jīng)典閉包案例

函數(shù)柯里化:

function curry(fn){
    var arg1 = Array.prototype.slice.call(arguments,1);
    return function(){
        var arg2 = Array.prototype.slice.call(arguments);
        var mergeArr = arg1.concat(arg2);
        return fn.apply(null,mergeArr);
    }
}

function add(num1,num2){ 
    return num1 + num2;
}

var curriedAdd = curry(add, 5); 
alert(curriedAdd(3)); // 8
疑惑

外部函數(shù)中定義的局部變量在函數(shù)返回之后就不存在了,那么嵌套的函數(shù)是如何調(diào)用不存在的作用域鏈的呢?如上面所示,調(diào)用curriedAdd()的時候,第一次傳入的5是存在的。那么5為什么能保存在函數(shù)變量里面的呢?

實現(xiàn)閉包

閉包:函數(shù)定義時的作用域鏈到函數(shù)執(zhí)行時仍然有效。

我們將函數(shù)作用域描述為一個對象列表,不是綁定的棧。每次調(diào)用javascript函數(shù)的時候,都會為之創(chuàng)建一個新的局部變量對象來保存局部變量,把這個對象添加至作用域鏈中。當函數(shù)返回的時候,就從作用域鏈中將這個綁定變量的對象刪除。

1.如果不存在嵌套的函數(shù),也沒有其他引用指向這個綁定的對象,它就會被當做垃圾回收掉。
2.如果定義了嵌套的函數(shù),每個嵌套的函數(shù)都各自對應(yīng)一個作用域鏈,并且這個作用域鏈指向一個變量綁定對象。
(1)如果這些嵌套函數(shù)對象在外部函數(shù)中保存了下來(比如賦值給外部函數(shù)中的某個變量),它們也會和所指向的變量綁定對象一樣當做垃圾回收
(2)但是如果這個函數(shù)定義了嵌套函數(shù),并將它們作為返回值返回,或者存儲在某處的屬性里,這時就會有一個外部引用指向這個嵌套函數(shù),它就不會被當做垃圾回收。并且它所指向的變量綁定對象也不會被當作垃圾回收。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/86907.html

相關(guān)文章

  • 重讀你不知道JS (上) 第一節(jié)五章

    摘要:詞法作用域的查找規(guī)則是閉包的一部分。因此的確同閉包息息相關(guān),即使本身并不會真的使用閉包。而上面的創(chuàng)建一個閉包,本質(zhì)上這是將一個塊轉(zhuǎn)換成一個可以被關(guān)閉的作用域。結(jié)合塊級作用域與閉包模塊這個模式在中被稱為模塊。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復雜微妙技術(shù)的語言,即使是經(jīng)驗豐富的 Jav...

    worldligang 評論0 收藏0
  • [JS]《你不知道Javascript·上》——詞法作用域和閉包

    摘要:吐槽一下,閉包這個詞的翻譯真是有很大的誤解性啊要說閉包,要先說下詞法作用域。閉包兩個作用通過閉包,在外部環(huán)境訪問內(nèi)部環(huán)境的變量。閉包使得函數(shù)可以繼續(xù)訪問定義時的詞法作用域。 閉包是真的讓人頭暈啊,看了很久還是覺得很模糊。只能把目前自己的一些理解先寫下來,這其中必定包含著一些錯誤,待日后有更深刻的理解時再作更改。 吐槽一下,閉包這個詞的翻譯真是有很大的誤解性啊…… 要說閉包,要先說下詞法...

    guqiu 評論0 收藏0
  • 你不知道JavaScript:閉包

    摘要:回憶我一年前,雖然使用過很多,但卻完全不理解閉包是什么。就算你,也會在循環(huán)完成時,輸出次當然,不要以為主要的原因是延遲函數(shù)會在循環(huán)結(jié)束時才執(zhí)行,不然我為什么會在閉包這一節(jié)用使用這個例子,哈哈。 前言 在了解閉包的概念時,我希望你能夠有JavaScript詞法作用域的知識,因為它會讓你更容易讀懂這篇文章。 感觸 對于那些使用過JavaScript但卻完全不理解閉包概念的人來說,理解閉包可...

    weknow619 評論0 收藏0
  • 你不知道JS》讀書筆記---作用域及閉包

    摘要:注此讀書筆記只記錄本人原先不太理解的內(nèi)容經(jīng)過閱讀你不知道的后的理解。作用域及閉包基礎(chǔ),代碼運行的幕后工作者引擎及編譯器。 注:此讀書筆記只記錄本人原先不太理解的內(nèi)容經(jīng)過閱讀《你不知道的JS》后的理解。 作用域及閉包基礎(chǔ),JS代碼運行的幕后工作者:引擎及編譯器。引擎負責JS程序的編譯及執(zhí)行,編譯器負責詞法分析和代碼生成。那么作用域就像一個容器,引擎及編譯器都從這里提取東西。 ...

    denson 評論0 收藏0
  • 你不知道javascript》筆記_作用域與閉包

    摘要:建筑的頂層代表全局作用域。實際的塊級作用域遠不止如此塊級作用域函數(shù)作用域早期盛行的立即執(zhí)行函數(shù)就是為了形成塊級作用域,不污染全局。這便是閉包的特點吧經(jīng)典面試題下面的代碼輸出內(nèi)容答案個如何處理能夠輸出閉包方式方式下一篇你不知道的筆記 下一篇:《你不知道的javascript》筆記_this 寫在前面 這一系列的筆記是在《javascript高級程序設(shè)計》讀書筆記系列的升華版本,旨在將零碎...

    galaxy_robot 評論0 收藏0

發(fā)表評論

0條評論

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