摘要:每個(gè)家庭就好比一個(gè)閉包函數(shù)不同的家庭有不同的老婆老公孩子,他們的名字甚至也可以是一樣的,然后每個(gè)家庭是獨(dú)立的。
定義
閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。。(百度百科)
案例解讀通俗的說:JavaScript中所有的function都是一個(gè)閉包
基本案例
function foo() { var i = 0; return function() { return ++i; } } var bar=foo();
這里的foo運(yùn)行后返回了一個(gè)函數(shù),這個(gè)函數(shù)擁有一個(gè)自己私有的變量i,這個(gè)變量i不會因?yàn)閒oo運(yùn)行結(jié)束了就被銷毀。
返回的這個(gè)函數(shù)被賦值給bar,這個(gè)bar就是一個(gè)閉包,它的特征是擁有自己的私有成員,該例子中私有成員是變量i,這個(gè)私有成員可以是一個(gè)函數(shù)
帶有循環(huán)的閉包
function foo() { var result = []; for (var i = 0; i < 10; i++) { result[i] = function(){return i}; } return result; } var bar = foo();
現(xiàn)象如上,原因是循環(huán)生成了10個(gè)閉包,但是,他們的私有成員i是他們共有的,當(dāng)最后一個(gè)閉包函數(shù)生成后,i的值已經(jīng)等于10,而前面的閉包的i都是這個(gè)i
循環(huán)生成閉包并且擁有真正的自己i
function foo() { var result = []; for (var i = 0; i < 10; i++) { result[i] = (function(i) { return function() { return i } })(i);仔細(xì)對比這里的區(qū)別 } return result; } var bar = foo();
總結(jié)顯然,循環(huán)生成的每個(gè)閉包都真正擁有的自己私有變量,解決辦法是代碼中的自執(zhí)行函數(shù)包裹需要生成的閉包函數(shù),并為閉包函數(shù)提供一個(gè)獨(dú)立的變量,這個(gè)時(shí)候它們的i是來自包裹它們的自執(zhí)行函數(shù)的參數(shù),而不是剛才的foo里面的那個(gè)i,所以它們各是各的
閉包的用途在我看來是為函數(shù)提供私有的變量,使得數(shù)據(jù)安全,不會污染別人的變量,別人的成員,別人的老婆。
每個(gè)家庭就好比一個(gè)閉包函數(shù),不同的家庭有不同的老婆、老公、孩子,他們的名字甚至也可以是一樣的,然后每個(gè)家庭是獨(dú)立的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/78384.html
摘要:怎么理解這句話呢也就是說一個(gè)函數(shù)離開了創(chuàng)建時(shí)的作用域,但是其還是會和這個(gè)作用域以及這個(gè)函數(shù)外部的作用域相關(guān)聯(lián),也就是說變量依舊是那個(gè)變量以這個(gè)題目為參照,那么結(jié)果就很明了了。 var a = 2;var func = (function(){ var a = 3; return function(){ a++; console.log(a); } })(); func(...
摘要:簡要介紹閉包可謂是中的一大特色了,即使你對閉包沒概念,你可能已經(jīng)在不知不覺中使用到了閉包。這就是閉包的獨(dú)特之處。當(dāng)頁面中存在過多的閉包,或者閉包的嵌套很多很深時(shí),會導(dǎo)致內(nèi)存占用過多。因此,在這里建議慎用閉包。 1. 簡要介紹 閉包可謂是js中的一大特色了,即使你對閉包沒概念,你可能已經(jīng)在不知不覺中使用到了閉包。閉包是什么,閉包就是一個(gè)函數(shù)可以訪問到另一個(gè)函數(shù)的變量。這就是閉包,解釋起...
摘要:所以,全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個(gè)對象。講到這里,可能你已經(jīng)對執(zhí)行環(huán)境執(zhí)行環(huán)境對象變量對象作用域作用域鏈的理解已經(jīng)他們之間的關(guān)系有了一個(gè)較清晰的認(rèn)識。 JavaScript中的執(zhí)行環(huán)境、作用域、作用域鏈、閉包一直是一個(gè)非常有意思的話題,很多博主和大神都分享過相關(guān)的文章。這些知識點(diǎn)不僅比較抽象,不易理解,更重要的是與這些知識點(diǎn)相關(guān)的問題在面試中高頻出現(xiàn)。之前我也看過...
摘要:建筑的頂層代表全局作用域。實(shí)際的塊級作用域遠(yuǎn)不止如此塊級作用域函數(shù)作用域早期盛行的立即執(zhí)行函數(shù)就是為了形成塊級作用域,不污染全局。這便是閉包的特點(diǎn)吧經(jīng)典面試題下面的代碼輸出內(nèi)容答案個(gè)如何處理能夠輸出閉包方式方式下一篇你不知道的筆記 下一篇:《你不知道的javascript》筆記_this 寫在前面 這一系列的筆記是在《javascript高級程序設(shè)計(jì)》讀書筆記系列的升華版本,旨在將零碎...
摘要:離開閉包的泥淖,給這個(gè)例子一個(gè)較為合理的寫法總結(jié)理解閉包的概念是重要的,但我們不應(yīng)當(dāng)過多的使用閉包,它有優(yōu)點(diǎn),也優(yōu)缺點(diǎn),是一把雙刃劍。 閉包 關(guān)于閉包,目前有如下說法: 閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合(MDN) 函數(shù)對象可以通過作用域鏈相互關(guān)聯(lián)起來,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi)。這種特性在計(jì)算機(jī)科學(xué)文獻(xiàn)中被稱為閉包(JavaScript權(quán)威指南) 閉包,指的是詞...
閱讀 1600·2023-04-25 17:41
閱讀 3110·2021-11-22 15:08
閱讀 913·2021-09-29 09:35
閱讀 1678·2021-09-27 13:35
閱讀 3403·2021-08-31 09:44
閱讀 2774·2019-08-30 13:20
閱讀 2011·2019-08-30 13:00
閱讀 2624·2019-08-26 12:12