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

資訊專欄INFORMATION COLUMN

javascript閉包不完全探索記錄01:閉包?啥餡的?

TANKING / 2856人閱讀

摘要:閉包一詞來源于以下兩者的結合要執行的代碼塊由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放和為自由變量提供綁定的計算環境作用域。在以及及以上等語言中都能找到對閉包不同程度的支持。

溫馨提示:作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命

閉包,好吃嗎 ?

第一次聽到這個詞,很不幸是在一次面試中,可想而知結果很細碎,從此“閉包”和“跨域”在我匱乏的前端知識中成為了兩座無法翻閱的大山,即便一度轉設計,還是活在他們的陰影之下。

不過怎么說呢。緣,妙不可言,感謝某司讓我猝不及防的重新走上了前端之路,既然又走回來了,一個前端工程師的(偽)的自尊告訴我這回必須要剛正面了

一聽這個詞,我就一臉懵逼,這是個名詞,還是個動詞?這是個包?還是個什么操作?我覺得對這個詞本身的認識,在了解一個事物上非常重要,而且經驗告訴我對于這種看上去就知道是被專(hu)業(bi)翻譯過來的外來詞匯,千萬不要嘗試通過中文字面意義去理解他,一定要去看看它在英文中的意思

closure    英[?kl????(r)] 美[?klo???(r)]
n.結束; (永久的) 停業,關閉; [電] 閉合; [數] 閉包;
vt. 使結束,使終止; 使停止辯論;

這下明白了,這貨是個名詞,這下對他能有一個客觀的認識了,“閉包”這個詞,他就是一個東西,一個結束了,關閉了,閉合了的東西

下面在看看*度百科上面定義

閉包包含自由(未綁定到特定對象)變量;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量)。“閉包” 一詞來源于以下兩者的結合:要執行的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環境(作用域)。在PHP、Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Go、Lua、objective c、swift 以及Java(Java8及以上)等語言中都能找到對閉包不同程度的支持。

怎么說呢,我堅信這不是人話,經過翻譯,說了兩件事:

閉包中有一堆不被釋放的變量(這就明白什么為什么叫closure了)

很多語言都有(本文只看javascript)

閉包,什么樣?

經過上面對閉包概念的初步理解,知道了這是一個包含一堆沒有被釋放的變量的東西,那這貨在javascript中到底是以什么樣的形式存在的呢?

知乎上的相關回答五花八門,從各個角度都有很是精彩但是容易懵逼
如何才能通俗易懂的解釋javascript里面的‘閉包’? - 知乎
所以不妨先去看看大神相對“正統”博文
學習Javascript閉包(Closure)- 阮一峰
JavaScript之作用域與閉包詳解 - 默語

總之,大家都提到了要從javascript變量的作用域的一個特點開始說起

變量的作用域無非就是兩種:全局變量和局部變量。
Javascript語言的特殊之處,就在于函數內部可以直接讀取全局變量。
每次定義一個函數,都會產生一個作用域鏈(scope chain)。當JavaScript尋找變量varible時(這個過程稱為變量解析),總會優先在當前作用域鏈的第一個對象中查找屬性varible ,如果找到,則直接使用這個屬性;否則,繼續查找下一個對象的是否存在這個屬性;這個過程會持續直至找到這個屬性或者最終未找到引發錯誤為止。

可以理解為,javascript有一個特點,就是在函數中,有“作用域鏈”這么個東西,大概意思是,你作為函數中的一個變量,在找自己的值的時候,是從里往外找的,你要先看自己所在函數中有沒有給你賦值,沒有就往外走,看看你外面一層有沒有,直到找到或者找不到報錯為止。
因為有這個原理的存在,也就能解釋為什么函數內部可以讀取外部的變量了

下面我們來做個實驗:

var a = "a";
var b = "b";
function test(){
    var c = "c";
    var b = "d"
    function testInner(){
        console.log(a);//a
        console.log(b);//d
        console.log(c);//c
    }
    testInner();
}
test();
console.log(b);//b,
console.log(d);//ReferenceError: d is not defined

結果可知:

函數內部可以讀取外部函數變量,以及全局變量,并且是由內向外讀取的

函數外部無法讀取內部的變量(廢話)

那如果我們要是想在外面get到函數內部變量的值呢?這個變量誰知道呢,答案是顯而易見的

他的內部函數是可以讀取他外部函數變量的,而這個內部函數就是一個閉包
//下文有更新

講個故事來說,老王對自己的兒子小王(內部函數)是無話不說的,但是對自己的老婆(老王的上一層)卻習慣性裝傻,于是王太太就只能通過小王知道老王的私房錢在哪了,而這個帶著私房錢信息的小王就是閉包。

這就又有一個問題了,王太太是怎么找到小王的呢/外部如何才能得到內部函數的呢,這簡單,老王喝多了自己讓王太太帶小王去玩的/函數將內部函數作為返回值

看下面這個例子:

function getMoneyInfo(){
    var moneyInfo = "馬桶水箱里";
    function askXiaoWang(){
        return moneyInfo
    }
    return askXiaoWang()
}
console.log(getMoneyInfo())//馬桶水箱里
console.log(moneyInfo)//ReferenceError: moneyInfo is not defined

看到這里,感覺對閉包是個啥,以及是怎么來的有了個大概的認識,但是他具體是干啥的,有什么非用不可的好處,以及除了面試到底有什么應用場景,將在今后繼續學習!

看到這里的都是真愛

20171126:更正與補充
經過對各大神的博文再次閱讀,發現上文有些事情還是沒說清楚:

既然closure有閉合和結束的意思,那到底是什么被關閉和結束了呢,也就是說是什么保持了一個不變的狀態呢
是這個函數以及其所引用的變量

閉包的產生,之所以是closure,是因為由于在更外層調用了內部的函數,所以與這個函數所相關的一切都不能在外層工作完成前被釋放,這也就是所謂的閉合和結束了,也就是會一直保持一種不變的狀態。

說句人話,按照老王之前的習慣,私房錢(似有變量)用完了,下次再有私房錢(函數再次被調用)就換個地方(內存中),老婆根本不可能找得到,但是現在有了小王(內部函數)在,他一直被他媽安排盯著廁所水箱,老王就是想花錢都沒法花了,對他來說,這點錢算是結束(closure)了,而在這看著錢的小王,就是一個所謂的閉包了

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

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

相關文章

  • javascript閉包完全探索記錄02:閉包?干嘛使!

    摘要:溫馨提示作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命溫馨提示續本文將會成為一篇筆記類型的文章,記錄閉包具體的應用方式溫馨提示再續本文存在錯誤,會慢慢改進的,請不要把我說的當真在上一篇博文閉包不完全探索記錄閉包啥餡的中,對中 溫馨提示:作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命溫馨提示-續:本文(maybe)將會成為一篇筆記類型的文章,記錄閉包具體的應用方式溫馨...

    Render 評論0 收藏0
  • javascript對象完全探索記錄01:this! which?

    溫馨提示:作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命 這一切,源于阮大神博文學習Javascript閉包(Closure)- 阮一峰中的一道思考題 //問題1: var name = The Window; var object = {   name : My Object,   getNameFunc : function(){     return function(){    ...

    rubyshen 評論0 收藏0
  • JavaScript 是如何工作的:模塊的構建以及對應的打包工具

    摘要:掛機科了次使用這個結構,匿名函數就有了自己的執行環境或閉包,然后我們立即執行。注意,匿名函數的圓括號是必需的,因為以關鍵字開頭的語句通常被認為是函數聲明請記住,中不能使用未命名的函數聲明。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 20 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可以在這里找到它們: ...

    hedzr 評論0 收藏0
  • 翻譯連載 | JavaScript輕量級函數式編程-第7章: 閉包vs對象 |《你知道的JS》姊妹

    摘要:相像閉包和對象之間的關系可能不是那么明顯。一個沒有對象的編程語言可以用閉包來模擬對象。事實上,表達一個對象為閉包形式,或閉包為對象形式是相當簡單的。簡而言之,閉包和對象是狀態的同構表示及其相關功能。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著滬江血液的純粹工程:認真,...

    leanxi 評論0 收藏0
  • 學習JavaScript之內存泄漏

    摘要:接上回我寫了一篇關于閉包的博客學習之閉包,最后談到閉包導致的問題時留了一個尾在以下的瀏覽器中會有內存泄漏的問題。今天的博客就繼續探索一下內存泄漏的問題。博客地址的前端之路原文鏈接學習之內存泄漏 接上回我寫了一篇關于閉包的博客《學習JavaScript之閉包》, 最后談到閉包導致的問題時留了一個尾: 在IE9以下的瀏覽器中會有內存泄漏的問題。 今天的博客就繼續探索一下內存泄漏的問題。 淺...

    nodejh 評論0 收藏0

發表評論

0條評論

TANKING

|高級講師

TA的文章

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