中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

理解javascript函數式編程中的閉包(closure)
來源:易賢網 閱讀:1166 次 日期:2016-07-21 16:09:33
溫馨提示:易賢網小編為您整理了“理解javascript函數式編程中的閉包(closure)”,方便廣大網友查閱!

這篇文章主要幫助大家理解javascript函數式編程中的閉包(closure)概念,通俗地講, JavaScript 中每個的函數都是一個閉包,感興趣的小伙伴們可以參考一下

閉包(closure)是函數式編程中的概念,出現于 20 世紀 60 年代,最早實現閉包的語言是 Scheme,它是 LISP 的一種方言。之后閉包特性被其他語言廣泛吸納。

閉包的嚴格定義是“由函數(環境)及其封閉的自由變量組成的集合體。”這個定義對于大家來說有些晦澀難懂,所以讓我們先通過例子和不那么嚴格的解釋來說明什么是閉包,然后再舉例說明一些閉包的經典用途。

什么是閉包

通俗地講, JavaScript 中每個的函數都是一個閉包,但通常意義上嵌套的函數更能夠體

現出閉包的特性,請看下面這個例子:

var generateClosure = function() {

var count = 0;

var get = function() {

count ++;

return count;

};

return get;

};

var counter = generateClosure();

console.log(counter()); // 輸出 1

console.log(counter()); // 輸出 2

console.log(counter()); // 輸出 3

這段代碼中, generateClosure() 函數中有一個局部變量count, 初值為 0。還有一個叫做 get 的函數, get 將其父作用域,也就是 generateClosure() 函數中的 count 變量增加 1,并返回 count 的值。 generateClosure() 的返回值是 get 函數。在外部我們通過 counter 變量調用了 generateClosure() 函數并獲取了它的返回值,也就是 get 函數,接下來反復調用幾次 counter(),我們發現每次返回的值都遞增了 1。

讓我們看看上面的例子有什么特點,按照通常命令式編程思維的理解, count 是generateClosure 函數內部的變量,它的生命周期就是 generateClosure 被調用的時期,當 generateClosure 從調用棧中返回時, count 變量申請的空間也就被釋放。問題是,在 generateClosure() 調用結束后, counter() 卻引用了“已經釋放了的” count變量,而且非但沒有出錯,反而每次調用 counter() 時還修改并返回了 count。這是怎么回事呢?

這正是所謂閉包的特性。當一個函數返回它內部定義的一個函數時,就產生了一個閉包,閉 包 不 但 包 括 被 返 回 的 函 數 , 還包括這個函數的定義環境。上面例子中,當函數generateClosure() 的內部函數 get 被一個外部變量 counter 引用時, counter 和generateClosure() 的局部變量就是一個閉包。如果還不夠清晰,下面這個例子可以幫助

你理解:

var generateClosure = function() {

var count = 0;

var get = function() {

count ++;

return count;

};

return get;

};

var counter1 = generateClosure();

var counter2 = generateClosure();

console.log(counter1()); // 輸出 1

console.log(counter2()); // 輸出 1

console.log(counter1()); // 輸出 2

console.log(counter1()); // 輸出 3

console.log(counter2()); // 輸出 2

上面這個例子解釋了閉包是如何產生的:counter1 和 counter2 分別調用了 generateClosure() 函數,生成了兩個閉包的實例,它們內部引用的 count 變量分別屬于各自的運行環境。我們可以理解為,在generateClosure() 返回 get 函數時,私下將 get 可能引用到的 generateClosure() 函數的內部變量(也就是 count 變量)也返回了,并在內存中生成了一個副本,之后 generateClosure() 返回的函數的兩個實例 counter1和 counter2 就是相互獨立的了。

閉包的用途

1、嵌套的回調函數

閉包有兩個主要用途,一是實現嵌套的回調函數,二是隱藏對象的細節。讓我們先看下面這段代碼示例,了解嵌套的回調函數。如下代碼是在 Node.js 中使用 MongoDB 實現一個簡單的增加用戶的功能:

exports.add_user = function(user_info, callback) {

var uid = parseInt(user_info['uid']);

mongodb.open(function(err, db) {

if (err) {callback(err); return;}

db.collection('users', function(err, collection) {

if (err) {callback(err); return;}

collection.ensureIndex("uid", function(err) {

if (err) {callback(err); return;}

collection.ensureIndex("username", function(err) {

if (err) {callback(err); return;}

collection.findOne({uid: uid}, function(err) {

if (err) {callback(err); return;}

if (doc) {

callback('occupied');

} else {

var user = {

uid: uid,

user: user_info,

};

collection.insert(user, function(err) {

callback(err);

});

}

});

});

});

});

});

};

如果你對 Node.js 或 MongoDB 不熟悉,沒關系,不需要去理解細節,只要看清楚大概的邏輯即可。這段代碼中用到了閉包的層層嵌套,每一層的嵌套都是一個回調函數。回調函數不會立即執行,而是等待相應請求處理完后由請求的函數回調。我們可以看到,在嵌套的每一層中都有對 callback 的引用,而且最里層還用到了外層定義的 uid 變量。由于閉包機制的存在,即使外層函數已經執行完畢,其作用域內申請的變量也不會釋放,因為里層的函數還有可能引用到這些變量,這樣就完美地實現了嵌套的異步回調。

2、實現私有成員

我們知道, JavaScript 的對象沒有私有屬性,也就是說對象的每一個屬性都是曝露給外部的。這樣可能會有安全隱患,譬如對象的使用者直接修改了某個屬性,導致對象內部數據的一致性受到破壞等。 JavaScript通過約定在所有私有屬性前加上下劃線(例如_myPrivateProp),表示這個屬性是私有的,外部對象不應該直接讀寫它。但這只是個非正式的約定,假設對象的使用者不這么做,有沒有更嚴格的機制呢?答案是有的,通過閉包可以實現。讓我們再看看前面那個例子:

var generateClosure = function() {

var count = 0;

var get = function() {

count ++;

return count;

};

return get;

};

var counter = generateClosure();

console.log(counter()); // 輸出 1

console.log(counter()); // 輸出 2

console.log(counter()); // 輸出 3

我們可以看到,只有調用 counter() 才能訪問到閉包內的 count 變量,并按照規則對其增加1,除此之外決無可能用其他方式找到 count 變量。受到這個簡單例子的啟發,我們可以把一個對象用閉包封裝起來,只返回一個“訪問器”的對象,即可實現對細節隱藏。

以上就是本文的全部內容,希望能夠幫助大家更好的學習理解javascript閉包。

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国内久久视频| 欧美精品久久天天躁 | 欧美日韩一区三区四区| 最新中文字幕一区二区三区| 欧美激情综合亚洲一二区| 一本色道久久综合亚洲91| 国产精品免费在线| 久久综合给合久久狠狠色| 亚洲精品一区二区三区不| 国产精品捆绑调教| 免费看成人av| 亚洲主播在线观看| 在线日韩电影| 国产精品一区二区女厕厕| 女人色偷偷aa久久天堂| 亚洲欧美中文日韩v在线观看| 亚洲电影av在线| 国产精品成人午夜| 六月婷婷一区| 亚洲午夜精品久久| 91久久一区二区| 国产专区欧美精品| 欧美日韩在线播放三区四区| 久久综合一区二区| 欧美在线观看天堂一区二区三区 | 伊人久久大香线蕉av超碰演员| 欧美精品一区二区三区蜜臀| 久久久久久高潮国产精品视| 亚洲专区一二三| 亚洲精品专区| 亚洲福利视频一区| 国产亚洲精品7777| 国产精品欧美日韩一区二区| 欧美喷水视频| 欧美成人蜜桃| 美日韩精品免费观看视频| 久久九九精品99国产精品| 亚洲欧美欧美一区二区三区| 一区二区高清| 日韩午夜电影av| 亚洲精品1区2区| 国产在线拍偷自揄拍精品| 欧美伦理在线观看| 欧美成人有码| 牛夜精品久久久久久久99黑人| 久久激情五月婷婷| 久久久久国产一区二区| 久久9热精品视频| 亚洲欧美清纯在线制服| 国产一区二区三区四区在线观看| 欧美另类在线播放| 国产精品久久久999| 欧美午夜视频在线观看| 欧美喷水视频| 国产美女一区| 国产婷婷97碰碰久久人人蜜臀| 国产欧美日韩精品a在线观看| 精品91久久久久| 亚洲另类春色国产| 亚洲欧洲日夜超级视频| 一区二区av| 一区二区三区欧美激情| 日韩视频三区| 一二三区精品福利视频| 亚洲一品av免费观看| 性xx色xx综合久久久xx| 久久国产精品99精品国产| 久久久人成影片一区二区三区| 久久久久久久网| 欧美顶级少妇做爰| 国产精品久久久久久av下载红粉| 国产精品一区二区三区免费观看| 国产主播喷水一区二区| 亚洲国产成人久久| 亚洲图片在线观看| 欧美一区二区三区免费观看| 久久午夜av| 欧美午夜在线一二页| 韩国欧美一区| 一区二区三区黄色| 久久久噜噜噜久久中文字幕色伊伊| 欧美成人资源| 国产女人aaa级久久久级| 亚洲国产cao| 亚洲免费视频在线观看| 久久夜色撩人精品| 国产精品久久久久久久久久免费| 国外视频精品毛片| 在线亚洲欧美| 久久夜色精品国产亚洲aⅴ| 欧美视频1区| 韩国亚洲精品| 亚洲一区二区成人| 欧美高清自拍一区| 国产欧美日本一区二区三区| 99精品视频一区| 久久婷婷激情| 国产日韩精品在线观看| 一本久久青青| 欧美国产乱视频| 激情亚洲成人| 午夜精品久久久久久99热软件| 欧美激情精品久久久| 经典三级久久| 欧美一区免费视频| 国产精品久久久久77777| 亚洲日本中文| 影音先锋中文字幕一区二区| 亚洲免费在线视频| 国产女主播视频一区二区| 欧美福利网址| 欧美中文字幕视频在线观看| 亚洲黄色一区二区三区| 国产精品久久久久久av福利软件| 蜜臀av在线播放一区二区三区| 亚洲欧美激情四射在线日| 91久久综合亚洲鲁鲁五月天| 亚洲激情亚洲| 欧美中文字幕在线观看| 欧美午夜一区| 一本久久综合| 欧美日韩一区二区三区四区五区| 在线成人免费视频| 国产一区在线视频| 亚洲韩国一区二区三区| 亚洲欧美日韩精品久久久| 欧美亚洲一区二区在线观看| 国产日韩欧美不卡| 国产性做久久久久久| 国产精品一级在线| 欧美成人一二三| 欧美午夜片在线观看| 欧美ed2k| 久久午夜电影网| 一区二区三区精品久久久| 中文亚洲字幕| 久久av一区二区| 欧美绝品在线观看成人午夜影视| 国产精品h在线观看| 国产精品久久综合| 国产精品狠色婷| 在线日韩视频| 国内精品美女在线观看| 亚洲美女视频在线观看| 亚洲一区免费在线观看| 欧美国产精品一区| 宅男在线国产精品| 欧美日韩免费在线视频| 久久精彩免费视频| 亚洲高清自拍| 欧美成人精品激情在线观看| 在线成人欧美| 久久亚洲美女| 一区在线免费| 久久午夜色播影院免费高清| 国产精品自在在线| 亚洲综合精品| 国产一区二区三区自拍| 老色批av在线精品| 亚洲国产成人久久综合| 欧美极品一区| 亚洲电影av| 男人的天堂成人在线| av72成人在线| 国产欧美精品日韩区二区麻豆天美| 欧美一区二区三区四区在线观看地址| 国产精品亚洲人在线观看| 久久成人人人人精品欧| 最新日韩精品| 欧美色精品天天在线观看视频| 久久夜色精品| 久久久精品国产99久久精品芒果| 伊人久久婷婷| 欧美日韩国产a| 久久精品亚洲精品国产欧美kt∨| 亚洲人成人99网站| 国产日韩欧美一区二区三区四区| 久热国产精品| 久久精品国产欧美亚洲人人爽| 亚洲日本欧美在线| 国产人久久人人人人爽| 国产精品另类一区| 国产精品美女一区二区在线观看| 久久综合九色综合久99| 亚洲欧美欧美一区二区三区| 一区二区三区高清不卡| 在线观看日韩国产| 伊人久久亚洲影院| 一本一本久久| 黄色亚洲在线| 欧美日韩视频不卡| 亚洲免费在线看| 亚洲国产日韩精品| 欧美性大战久久久久| 亚洲欧美日韩天堂| 亚洲精品视频啊美女在线直播| 亚洲欧洲在线视频| 国产精品亚洲аv天堂网| 久久综合狠狠综合久久综合88| 国产精品99久久久久久久vr|