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

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

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

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

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

什么是閉包

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

現(xiàn)出閉包的特性,請(qǐng)看下面這個(gè)例子:

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() 函數(shù)中有一個(gè)局部變量count, 初值為 0。還有一個(gè)叫做 get 的函數(shù), get 將其父作用域,也就是 generateClosure() 函數(shù)中的 count 變量增加 1,并返回 count 的值。 generateClosure() 的返回值是 get 函數(shù)。在外部我們通過 counter 變量調(diào)用了 generateClosure() 函數(shù)并獲取了它的返回值,也就是 get 函數(shù),接下來(lái)反復(fù)調(diào)用幾次 counter(),我們發(fā)現(xiàn)每次返回的值都遞增了 1。

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

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

你理解:

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

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

閉包的用途

1、嵌套的回調(diào)函數(shù)

閉包有兩個(gè)主要用途,一是實(shí)現(xiàn)嵌套的回調(diào)函數(shù),二是隱藏對(duì)象的細(xì)節(jié)。讓我們先看下面這段代碼示例,了解嵌套的回調(diào)函數(shù)。如下代碼是在 Node.js 中使用 MongoDB 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的增加用戶的功能:

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);

});

}

});

});

});

});

});

};

如果你對(duì) Node.js 或 MongoDB 不熟悉,沒關(guān)系,不需要去理解細(xì)節(jié),只要看清楚大概的邏輯即可。這段代碼中用到了閉包的層層嵌套,每一層的嵌套都是一個(gè)回調(diào)函數(shù)。回調(diào)函數(shù)不會(huì)立即執(zhí)行,而是等待相應(yīng)請(qǐng)求處理完后由請(qǐng)求的函數(shù)回調(diào)。我們可以看到,在嵌套的每一層中都有對(duì) callback 的引用,而且最里層還用到了外層定義的 uid 變量。由于閉包機(jī)制的存在,即使外層函數(shù)已經(jīng)執(zhí)行完畢,其作用域內(nèi)申請(qǐng)的變量也不會(huì)釋放,因?yàn)槔飳拥暮瘮?shù)還有可能引用到這些變量,這樣就完美地實(shí)現(xiàn)了嵌套的異步回調(diào)。

2、實(shí)現(xiàn)私有成員

我們知道, JavaScript 的對(duì)象沒有私有屬性,也就是說(shuō)對(duì)象的每一個(gè)屬性都是曝露給外部的。這樣可能會(huì)有安全隱患,譬如對(duì)象的使用者直接修改了某個(gè)屬性,導(dǎo)致對(duì)象內(nèi)部數(shù)據(jù)的一致性受到破壞等。 JavaScript通過約定在所有私有屬性前加上下劃線(例如_myPrivateProp),表示這個(gè)屬性是私有的,外部對(duì)象不應(yīng)該直接讀寫它。但這只是個(gè)非正式的約定,假設(shè)對(duì)象的使用者不這么做,有沒有更嚴(yán)格的機(jī)制呢?答案是有的,通過閉包可以實(shí)現(xiàn)。讓我們?cè)倏纯辞懊婺莻€(gè)例子:

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

我們可以看到,只有調(diào)用 counter() 才能訪問到閉包內(nèi)的 count 變量,并按照規(guī)則對(duì)其增加1,除此之外決無(wú)可能用其他方式找到 count 變量。受到這個(gè)簡(jiǎn)單例子的啟發(fā),我們可以把一個(gè)對(duì)象用閉包封裝起來(lái),只返回一個(gè)“訪問器”的對(duì)象,即可實(shí)現(xiàn)對(duì)細(xì)節(jié)隱藏。

以上就是本文的全部?jī)?nèi)容,希望能夠幫助大家更好的學(xué)習(xí)理解javascript閉包。

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:理解javascript函數(shù)式編程中的閉包(closure)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn)

版權(quán)所有:易賢網(wǎng)

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
精品免费日韩av| 日韩高清欧美激情| 日韩精品久久理论片| 国产99久久久精品| 精品欧美乱码久久久久久1区2区| 亚洲欧美日韩中文字幕一区二区三区| 蜜桃视频在线一区| 欧美日韩国产大片| 国产精品乱人伦中文| 黄一区二区三区| 欧美精品黑人性xxxx| 一区二区免费在线| 99久久99久久精品免费看蜜桃| 日韩精品一区二区三区四区视频 | 香蕉影视欧美成人| 9l国产精品久久久久麻豆| 精品粉嫩aⅴ一区二区三区四区 | 亚洲国产精品激情在线观看| 日本美女视频一区二区| 欧美日韩国产高清一区二区| 亚洲美女在线国产| 色综合久久久久综合体| 国产精品黄色在线观看| 成人av电影在线网| 国产精品久久久久影视| 欧美日韩国产免费| 亚洲综合激情网| 欧美中文字幕一二三区视频| 一二三区精品福利视频| 99vv1com这只有精品| 国产精品久久久久久久浪潮网站 | 在线综合视频播放| 午夜精品一区二区三区免费视频| 欧美网站大全在线观看| 午夜欧美一区二区三区在线播放| 欧美日韩国产乱码电影| 天堂蜜桃91精品| 欧美日韩综合在线| 午夜精品福利在线| 欧美一区日本一区韩国一区| 久久99国产精品尤物| 久久美女高清视频| 成年人午夜久久久| 亚洲精品免费一二三区| 欧美日韩五月天| 美女网站在线免费欧美精品| 久久亚洲二区三区| 成人av网站在线观看| 国产一区二区看久久| 精品国产乱码久久久久久闺蜜| 理论片日本一区| 国产精品女主播av| 欧美亚洲综合色| 另类综合日韩欧美亚洲| 国产精品免费aⅴ片在线观看| 色综合色综合色综合 | 国产成人在线视频网站| 亚洲四区在线观看| 91精品国产综合久久久久久久 | 久久99精品国产麻豆婷婷| 国产亚洲精品bt天堂精选| 99精品热视频| 日本亚洲最大的色成网站www| 久久久天堂av| 在线观看日韩毛片| 国产一区激情在线| 亚洲精品你懂的| 精品欧美黑人一区二区三区| 色香蕉久久蜜桃| 国模无码大尺度一区二区三区| 亚洲欧美激情一区二区| 欧美电影免费观看高清完整版在线 | 在线免费观看成人短视频| 喷水一区二区三区| 成人免费一区二区三区视频 | 国内外精品视频| 亚洲少妇中出一区| 久久影院视频免费| 欧美久久高跟鞋激| 91麻豆国产自产在线观看| 狠狠色丁香婷婷综合| 亚洲午夜久久久| ●精品国产综合乱码久久久久| 欧美一区二区国产| 色激情天天射综合网| 盗摄精品av一区二区三区| 久国产精品韩国三级视频| 亚洲国产综合色| 久久国产精品第一页| 首页国产欧美久久| 亚洲夂夂婷婷色拍ww47 | 久久色成人在线| 91精品国产综合久久精品性色| 91在线观看高清| 成人免费高清视频在线观看| 国产美女一区二区三区| 久久精品国产一区二区三区免费看| 亚洲成人综合在线| 一二三四区精品视频| 亚洲黄色免费电影| 亚洲女人****多毛耸耸8| 中文字幕在线一区| 国产精品传媒在线| 国产精品久久久久久久久久久免费看| 久久久电影一区二区三区| 精品少妇一区二区| 欧美成人vps| 精品美女在线播放| 亚洲精品在线免费播放| 精品国产一二三区| 久久天堂av综合合色蜜桃网| 久久综合一区二区| 国产三级一区二区| 欧美激情一区在线观看| 国产精品久久午夜| 亚洲欧美日韩国产另类专区| 亚洲男人都懂的| 亚洲一区在线观看视频| 午夜精品一区二区三区三上悠亚| 日韩福利电影在线| 久久av资源站| 国产大陆亚洲精品国产| 国产91精品在线观看| 99久久久久久99| 在线欧美日韩国产| 欧美精品在欧美一区二区少妇| 91精品福利在线一区二区三区| 日韩精品一区二| 欧美激情中文字幕一区二区| 亚洲另类在线视频| 丝袜亚洲另类欧美综合| 捆绑紧缚一区二区三区视频| 国产伦精品一区二区三区免费| 成人综合在线观看| 在线精品观看国产| 欧美tickling挠脚心丨vk| 欧美国产日产图区| 亚洲一区二区高清| 国产在线国偷精品免费看| 成+人+亚洲+综合天堂| 在线精品国精品国产尤物884a | 在线综合视频播放| 国产日产欧产精品推荐色| 亚洲你懂的在线视频| 看电视剧不卡顿的网站| 成人一区在线看| 7878成人国产在线观看| 国产日韩欧美a| 午夜精品久久久久影视| 岛国一区二区在线观看| 欧美人成免费网站| 国产精品麻豆视频| 美国欧美日韩国产在线播放| 99v久久综合狠狠综合久久| 欧美一区二区福利在线| 亚洲美女在线国产| 国产一区二区三区视频在线播放| 91网站在线播放| 精品久久久久久综合日本欧美| 国产精品传媒在线| 国产在线乱码一区二区三区| 久久品道一品道久久精品| 亚洲影视资源网| 成人免费看视频| 日韩美女天天操| 亚洲最大成人网4388xx| 成人精品国产福利| 精品国产91久久久久久久妲己| 亚洲一二三四久久| 成人国产精品免费| 久久久久99精品国产片| 热久久久久久久| 欧美日韩国产成人在线91| 亚洲美女淫视频| 成人黄色一级视频| 久久蜜桃av一区二区天堂| 日韩电影在线看| 欧美午夜电影在线播放| 国产精品国产三级国产普通话三级 | 午夜精品久久久久| 欧美艳星brazzers| 一区二区三区波多野结衣在线观看 | 亚洲猫色日本管| 国产91富婆露脸刺激对白| 精品国产一区二区三区四区四| 婷婷综合另类小说色区| 欧亚洲嫩模精品一区三区| 亚洲精品高清视频在线观看| yourporn久久国产精品| 中文字幕成人在线观看| 国产91在线看| 中文字幕成人av| 成人听书哪个软件好| 中文字幕免费一区| 成人高清视频免费观看| 亚洲欧美一区二区在线观看| 91蜜桃视频在线| 一个色在线综合| 欧美精品亚洲一区二区在线播放| 午夜视频在线观看一区二区|