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