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