摘要:另一個(gè)更有意思的例子以上例子中和都是閉包,它們共享了相同的函數(shù)定義,但保存了不同的詞法環(huán)境。閉包允許將函數(shù)和其操作的某些數(shù)據(jù)環(huán)境關(guān)聯(lián)起來(lái)。
摘自MDN:https://developer.mozilla.org...
閉包是函數(shù)和申明該函數(shù)的詞法環(huán)境的組合,這個(gè)環(huán)境包含了這個(gè)閉包創(chuàng)建時(shí)所能訪問(wèn)到的所有局部變量
function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName; } var myFunc = makeFunc(); myFunc(); //alert("Mozilla")
在上面的例子中,調(diào)用myFun函數(shù)能正常執(zhí)行,是因?yàn)樵赿isplayName函數(shù)中形成了閉包,包含了創(chuàng)建diaplayName函數(shù)時(shí)能訪問(wèn)到的局部變量name。
另一個(gè)更有意思的例子
function makeAdder(x) { return function(y) { return x + y; };} var add5 = makeAdder(5); var add10 = makeAdder(10); console.log(add5(2)); // 7 console.log(add10(2)); // 12
以上例子中add5和add10都是閉包,它們共享了相同的函數(shù)定義,但保存了不同的詞法環(huán)境。
閉包允許將函數(shù)和其操作的某些數(shù)據(jù)(環(huán)境)關(guān)聯(lián)起來(lái)。
1. 對(duì)只有一個(gè)方法的對(duì)象可以使用閉包 2. 可以用閉包模擬私有方法:私有方法不僅能限制對(duì)代碼的訪問(wèn),還提供了管理全局命名空間的能力,避免非核心的方法弄亂代碼的公共接口部分
下面這個(gè)例子使用閉包定義公共函數(shù),并令其可以訪問(wèn)私有函數(shù)和變量,這個(gè)方式也稱為模塊模式:
var Counter = (function() { var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { changeBy(-1); }, value: function() { return privateCounter; } } })(); console.log(Counter.value()); /* logs 0 */ Counter.increment(); Counter.increment(); console.log(Counter.value()); /* logs 2 */ Counter.decrement(); console.log(Counter.value()); /* logs 1 */
該共享環(huán)境建立于一個(gè)立即執(zhí)行的匿名函數(shù)體內(nèi)。這個(gè)環(huán)境中包含兩個(gè)私有項(xiàng):privateCounter變量和changeBy函數(shù),這兩項(xiàng)都無(wú)法在匿名函數(shù)外直接訪問(wèn),必須通過(guò)返回的三個(gè)公共函數(shù)進(jìn)行訪問(wèn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92919.html
摘要:函數(shù)表達(dá)式和閉包函數(shù)聲明的一個(gè)重要特征是函數(shù)聲明提升如遞歸遞歸函數(shù)是在一個(gè)函數(shù)通過(guò)名字調(diào)用自身的情況下構(gòu)成的。注意中已經(jīng)是塊級(jí)作用域了,所以這些東西感覺(jué)實(shí)際用途沒(méi)有那么大,但是對(duì)理解閉包對(duì)作用域鏈中的屬性的引用,這一點(diǎn)還是有作用的。 函數(shù)表達(dá)式和閉包 1. 函數(shù)聲明的一個(gè)重要特征是函數(shù)聲明提升 如: sayHi() function sayHi () { console.log(h...
摘要:但是如果非全局的變量如果被遮蔽了,無(wú)論如何都無(wú)法被訪問(wèn)到。但是如果引擎在代碼中找到,就會(huì)完全不做任何優(yōu)化。結(jié)構(gòu)的分句中具有塊級(jí)作用域。第四章提升編譯器函數(shù)聲明會(huì)被提升,而函數(shù)表達(dá)式不會(huì)被提升。 本書屬于基礎(chǔ)類書籍,會(huì)有比較多的基礎(chǔ)知識(shí),所以這里僅記錄平常不怎么容易注意到的知識(shí)點(diǎn),不會(huì)全記,供大家和自己翻閱; 上中下三本的讀書筆記: 《你不知道的JavaScript》 (上) 讀書筆記...
摘要:閉包能用來(lái)實(shí)現(xiàn)私有化和創(chuàng)建工廠函數(shù)等作用。關(guān)于閉包的常見(jiàn)面試題是這樣的寫一個(gè)函數(shù),循環(huán)一個(gè)整數(shù)數(shù)組,延遲秒打印這個(gè)數(shù)組中每個(gè)元素的索引。 文章來(lái)源:http://mp.weixin.qq.com/s/vs0... 前言 在公眾號(hào)上看到了這篇文章,覺(jué)得很有用,有助于理解JS學(xué)習(xí)中的一些重點(diǎn)難點(diǎn)。決定把它整理下發(fā)布出來(lái)。該文章主要介紹了JS中的三個(gè)問(wèn)題。在以后的幾篇文章里,我會(huì)詳細(xì)介紹這三...
摘要:上面的例子應(yīng)用了匿名函數(shù)這個(gè)特性,還可以使用構(gòu)造函數(shù)或者閉包來(lái)添加事件監(jiān)聽(tīng)器另一個(gè)重要特性,則是上面這段代碼中最后一行的最后一個(gè)參數(shù),用來(lái)控制監(jiān)聽(tīng)器對(duì)于冒泡事件的響應(yīng)。在這里你不能使用閉包或者匿名函數(shù),并且控制域也是有限的。 原文出處:addEventListener vs onclick 之所以會(huì)想到這個(gè)話題,是因?yàn)樵诨仡欁约褐皩懙臑?button 動(dòng)態(tài)綁定事件的函數(shù)時(shí),腦海里忽...
摘要:但是如果一個(gè)值不再用到了,引用次數(shù)卻不為,垃圾回收機(jī)制卻無(wú)法釋放這塊內(nèi)存,從而導(dǎo)致內(nèi)存泄漏。內(nèi)存泄漏垃圾回收語(yǔ)言的內(nèi)存泄漏主因是不需要的引用。常見(jiàn)內(nèi)存泄漏意外的全局變量處理未定義變量的方式比較寬松未定義的變量會(huì)在全局對(duì)象創(chuàng)建一個(gè)新變量。 簡(jiǎn)答題: settimeout 與 setInterval的區(qū)別, 及對(duì)他們的內(nèi)存的分析 區(qū)別 setTimeout是在一段時(shí)間后調(diào)用指定函數(shù)(僅一...
閱讀 3087·2019-08-30 15:56
閱讀 1242·2019-08-29 15:20
閱讀 1580·2019-08-29 13:19
閱讀 1489·2019-08-29 13:10
閱讀 3392·2019-08-26 18:27
閱讀 3077·2019-08-26 11:46
閱讀 2241·2019-08-26 11:45
閱讀 3769·2019-08-26 10:12