精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript閉包 懂不懂由你反正我是懂了

開(kāi)發(fā) 前端
“如果你不能向一個(gè)六歲的孩子解釋清楚,那么其實(shí)你自己根本就沒(méi)弄懂。”好吧,我試著向一個(gè)27歲的朋友就是JS閉包(JavaScript closure)卻徹底失敗了。

越來(lái)越覺(jué)得國(guó)內(nèi)沒(méi)有教書(shū)育人的氛圍,為了弄懂JS的閉包,我使出了我英語(yǔ)四級(jí)吃奶的勁去google上搜尋著有關(guān)閉包的解釋?zhuān)?dāng)我看到stackoverflow上這一篇解答,我腦中就出現(xiàn)了一句話:就是這貨沒(méi)跑了!

不才譯文見(jiàn)下,見(jiàn)笑了。

Peter Mortensen問(wèn):

就像老Albert所說(shuō)的,“如果你不能向一個(gè)六歲的孩子解釋清楚,那么其實(shí)你自己根本就沒(méi)弄懂。”好吧,我試著向一個(gè)27歲的朋友就是JS閉包(JavaScript closure)卻徹底失敗了。

你們會(huì)怎么把它解釋給一個(gè)充滿好奇心的六歲孩子聽(tīng)呢?

注:我看過(guò)StackOverflow上給出的示例,但根本沒(méi)用。

Ali的回答:

當(dāng)function里嵌套function時(shí),內(nèi)部的function可以訪問(wèn)外部function里的變量。

  1. function foo(x) {  
  2.   var tmp = 3;  
  3.   function bar(y) {  
  4.     alert(x + y + (++tmp));  
  5.   }  
  6.   bar(10);  
  7. }  
  8. foo(2) 

不管執(zhí)行多少次,都會(huì)alert 16,因?yàn)閎ar能訪問(wèn)foo的參數(shù)x,也能訪問(wèn)foo的變量tmp。

但,這還不是閉包。當(dāng)你return的是內(nèi)部function時(shí),就是一個(gè)閉包。內(nèi)部function會(huì)close-over外部function的變量直到內(nèi)部function結(jié)束。

  1. function foo(x) {  
  2.   var tmp = 3;  
  3.   return function (y) {  
  4.     alert(x + y + (++tmp));  
  5.   }  
  6. }  
  7. var bar = foo(2); // bar 現(xiàn)在是一個(gè)閉包  
  8. bar(10); 

 

上面的腳本最終也會(huì)alert 16,因?yàn)殡m然bar不直接處于foo的內(nèi)部作用域,但bar還是能訪問(wèn)x和tmp。

但是,由于tmp仍存在與bar閉包的內(nèi)部,所以它還是會(huì)自加1,而且你每次調(diào)用bar時(shí)它都會(huì)自加1.

(考慮到六歲這個(gè)限制:我們其實(shí)可以建立不止一個(gè)閉包方法,比如return它們的數(shù)組,也可以把它們?cè)O(shè)置為全局變量。它們?nèi)贾赶蛳嗤膞和相同的tmp,而不是各自有一份副本。)

注:現(xiàn)在來(lái)整點(diǎn)兒七歲的內(nèi)容。

上面的x是一個(gè)字面值(值傳遞),和JS里其他的字面值一樣,當(dāng)調(diào)用foo時(shí),實(shí)參x的值被復(fù)制了一份,復(fù)制的那一份作為了foo的參數(shù)x。

那么問(wèn)題來(lái)了,JS里處理object時(shí)是用到引用傳遞的,那么,你調(diào)用foo時(shí)傳遞一個(gè)object,foo函數(shù)return的閉包也會(huì)引用最初那個(gè)object!

  1. function foo(x) {  
  2.   var tmp = 3;  
  3.   return function (y) {  
  4.     alert(x + y + tmp);  
  5.     x.memb = x.memb ? x.memb + 1 : 1;  
  6.     alert(x.memb);  
  7.   }  
  8. }  
  9. var age = new Number(2);  
  10. var bar = foo(age); // bar 現(xiàn)在是一個(gè)引用了age的閉包  
  11. bar(10); 

不出我們意料,每次運(yùn)行bar(10),x.memb都會(huì)自加1。但需要注意的是x每次都指向同一個(gè)object變量——age,運(yùn)行兩次bar(10)后,age.memb會(huì)變成2.

這和HTML對(duì)象的內(nèi)存泄漏有關(guān),呃,不過(guò)貌似超出了答題的范圍。

JohnMerlino 對(duì)Ali說(shuō):

這里有一個(gè)不用return關(guān)鍵字的閉包例子:

  1. function closureExample(obj, text, timedelay) {   
  2.     setTimeout(function() {   
  3.         document.getElementById(objID).innerHTML = text;   
  4.         }, timedelay);   
  5. }   
  6. closureExample(‘myDiv’, ‘Closure is created’, 500);  

深夜1:37 John Pick這樣回答:

JS里的function能訪問(wèn)它們的:

1. 參數(shù)

2. 局部變量或函數(shù)

3. 外部變量(環(huán)境變量?),包括

3.1 全局變量,包括DOM

3.2 外部函數(shù)的變量或函數(shù)。

如果一個(gè)函數(shù)訪問(wèn)了它的外部變量,那么它就是一個(gè)閉包。

注意,外部函數(shù)不是必需的。通過(guò)訪問(wèn)外部變量,一個(gè)閉包可以維持(keep alive)這些變量。在內(nèi)部函數(shù)和外部函數(shù)的例子中,外部函數(shù)可以創(chuàng)建局部變量,并且最終退出;但是,如果任何一個(gè)或多個(gè)內(nèi)部函數(shù)在它退出后卻沒(méi)有退出,那么內(nèi)部函數(shù)就維持了外部函數(shù)的局部數(shù)據(jù)。

一個(gè)典型的例子就是全局變量的使用。

mykhal這樣回答:

Wikipedia對(duì)閉包的定義是這樣的:

In computer science, a closure is a function together with a referencing environment for the nonlocal names (free variables) of that function.

從技術(shù)上來(lái)講,在JS中,每個(gè)function都是閉包,因?yàn)樗偸悄茉L問(wèn)在它外部定義的數(shù)據(jù)。

Since scope-defining construction in Javascript is a function, not a code block like in many other languages, what we usually mean by closure in Javascript is a fuction working with nonlocal variables defined in already executed surrounding function.

閉包經(jīng)常用于創(chuàng)建含有隱藏?cái)?shù)據(jù)的函數(shù)(但并不總是這樣)。

  1. var db = (function() {  
  2.   // 創(chuàng)建一個(gè)隱藏的object, 這個(gè)object持有一些數(shù)據(jù)  
  3.   // 從外部是不能訪問(wèn)這個(gè)object的  
  4.   var data = {};  
  5.   // 創(chuàng)建一個(gè)函數(shù), 這個(gè)函數(shù)提供一些訪問(wèn)data的數(shù)據(jù)的方法  
  6.   return function(key, val) {  
  7.     if (val === undefined) { return data[key] } // get  
  8.     else { return data[key] = val } // set  
  9.   }  
  10.   // 我們可以調(diào)用這個(gè)匿名方法  
  11.   // 返回這個(gè)內(nèi)部函數(shù),它是一個(gè)閉包  
  12. })();  
  13. db('x');    // 返回 undefined  
  14. db('x', 1); // 設(shè)置data['x']為1  
  15. db('x');    // 返回 1  
  16. // 我們不可能訪問(wèn)data這個(gè)object本身  
  17. // 但是我們可以設(shè)置它的成員 

看了這么多外國(guó)大牛的解答,不知道你懂還是不懂,反正我是懂了。

原文:http://www.cnblogs.com/frankfang/archive/2011/08/03/2125663.html

【編輯推薦】

  1. 使用node.js進(jìn)行服務(wù)器端JavaScript編程
  2. 使用Jscex改善JavaScript異步編程體驗(yàn)
  3. JavaScript實(shí)現(xiàn)頁(yè)面滾動(dòng)圖片加載
  4. JavaScript入門(mén)之基本函數(shù)
  5. JavaScript入門(mén)
責(zé)任編輯:陳貽新 來(lái)源: Frank Fang的博客
相關(guān)推薦

2021-01-13 11:25:12

JavaScript閉包函數(shù)

2021-02-21 16:21:19

JavaScript閉包前端

2020-10-14 15:15:28

JavaScript(

2011-05-25 14:48:33

Javascript閉包

2025-07-10 00:25:00

2019-07-09 10:43:57

JavaScriptWeb前端

2023-04-03 13:24:17

ChatGPTPNAS語(yǔ)言

2019-11-07 21:51:18

閉包前端函數(shù)

2016-09-14 09:20:05

JavaScript閉包Web

2009-07-24 17:30:37

Javascript閉

2017-09-14 13:55:57

JavaScript

2016-09-18 20:53:16

JavaScript閉包前端

2017-05-22 16:08:30

前端開(kāi)發(fā)javascript閉包

2009-03-17 15:36:29

JavaScript循環(huán)事件

2010-06-23 10:24:42

Javascript閉

2012-11-29 10:09:23

Javascript閉包

2011-05-12 18:26:08

Javascript作用域

2011-05-30 14:41:09

Javascript閉

2011-03-02 12:33:00

JavaScript

2020-03-11 08:19:27

JavaScript閉包開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

窝窝社区一区二区| av中文在线资源库| 麻豆精品在线看| 欧美精品一区在线播放| xfplay5566色资源网站| 亚洲最大成人| 亚洲精品少妇30p| 鲁丝一区二区三区免费| 一区二区三区播放| 最新日韩av| 色777狠狠综合秋免鲁丝| 韩国三级在线看| 素人啪啪色综合| 亚洲一二三四在线观看| 日本高清视频一区二区三区| 国产av一区二区三区| 欧美综合二区| 欧美疯狂性受xxxxx另类| 黄免费在线观看| 亚洲一区二区免费在线观看| 在线一区二区三区四区| 国产精品成人久久电影| 青青影院在线观看| 久久精品欧美日韩精品| 韩国成人av| av免费在线不卡| 久久丁香综合五月国产三级网站| 午夜精品在线视频| 极品盗摄国产盗摄合集| 欧美色图激情小说| 日韩精品在线看| 韩国黄色一级片| www欧美在线观看| 欧美性videosxxxxx| 日韩欧美国产免费| 3344国产永久在线观看视频| 有码一区二区三区| 中文字幕人成一区| 在线视频1区2区| 欧美激情在线观看视频免费| 久久人人九九| 香蕉久久一区二区三区| 国产一区不卡在线| 成人精品一区二区三区电影黑人 | 亚洲欧美综合在线观看| 国产精品亚洲一区二区三区妖精 | 国产精品99在线观看| 亚洲欧美制服另类日韩| 日韩av一二区| 香蕉久久夜色精品国产更新时间| 欧美精品一区二| 中文字幕一区二区三区乱码不卡| 一区二区日韩| 日韩亚洲国产中文字幕欧美| 免费看的av网站| 国产亚洲观看| 日韩一级欧美一级| 欧美人与性动交α欧美精品| 精品精品视频| 欧美va亚洲va在线观看蝴蝶网| 小日子的在线观看免费第8集| 天堂综合在线播放| 9191精品国产综合久久久久久| 老司机久久精品| 国产精品18| 日韩一级免费一区| 午夜视频在线观看国产| 性欧美lx╳lx╳| 亚洲色在线视频| 91狠狠综合久久久久久| 97久久夜色精品国产| 久久精品国产亚洲精品2020| 欧美黑人猛猛猛| 激情综合久久| 欧美亚洲视频在线观看| 国产情侣免费视频| 国产一区二区影院| 国产91精品入口17c| 亚州av在线播放| 亚洲国产精品成人久久综合一区 | 在线看片成人| 日本精品免费观看| 亚洲午夜激情视频| 国产成人免费视频网站高清观看视频| 国产精品一区二区免费看| 青青国产在线| 中文字幕在线视频一区| 97超碰国产精品| 欧美xxx性| 91精品国产综合久久福利| 亚洲一区二区三区四区av| 欧美日韩播放| 久久国产视频网站| 欧美在线观看不卡| 久久国产精品区| 精品在线观看一区二区| av在线免费一区| 亚洲成人在线观看视频| www.精品在线| 精品成人自拍视频| 精品国产一区二区三区久久久 | 亚洲一区二区三区无码久久| 精品视频亚洲| 久久久伊人日本| 中文字幕在线视频第一页| 国产福利一区二区三区视频在线| 欧美激情论坛| 欧美人与动牲性行为| 在线观看一区日韩| 一级黄色片毛片| 久久影院100000精品| 91chinesevideo永久地址| 国产乱淫av免费| 国产性做久久久久久| 国产xxxx振车| 国产精品一区二区精品| 亚洲人成网站777色婷婷| 久久久久久免费观看| 久久激情综合网| 日本视频一区二区不卡| 91豆花视频在线播放| 日韩欧美一级精品久久| 成年人视频软件| 乱人伦精品视频在线观看| 91视频免费在线观看| 日韩在线免费电影| 91久久精品一区二区| 亚洲色偷偷色噜噜狠狠99网| 亚洲欧美一级二级三级| 国产精品亚洲激情| yourporn在线观看视频| 福利视频一区二区| 精品国产午夜福利在线观看| 我不卡神马影院| 国产区亚洲区欧美区| 国产乱理伦片a级在线观看| 精品久久中文字幕久久av| 久久精品aⅴ无码中文字字幕重口| 天天影视综合| 国产在线日韩在线| 91xxx在线观看| 欧美日韩一区二区三区在线看| 国产熟妇久久777777| 午夜在线a亚洲v天堂网2018| 国产精品视频免费一区二区三区| 中文字幕伦理免费在线视频| 91精品国产乱| 天天干中文字幕| 国产麻豆视频一区| 老司机午夜网站| 在线观看欧美| 久久久国产成人精品| 国产又黄又大又爽| 亚洲免费在线视频一区 二区| 亚洲精品手机在线观看| 亚洲综合自拍| 91久久久一线二线三线品牌| 性欧美videos高清hd4k| 精品久久久久一区二区国产| 日产精品久久久久| 91在线免费视频观看| 日本精品一区二区三区四区| 国产欧美日韩免费观看| 国产精品久久久久久久久久小说 | 一区二区三区日本| 日本性生活一级片| 新67194成人永久网站| 日本最新一区二区三区视频观看| 丁香婷婷久久| 欧美裸体xxxx极品少妇| 亚洲精品一区二区三区区别| 亚洲大片一区二区三区| 人妻丰满熟妇aⅴ无码| 久久久蜜桃一区二区人| 亚洲国产午夜伦理片大全在线观看网站 | a级片在线免费看| 亚洲国产一二三| wwwwxxxx国产| 狠狠色综合日日| 国产毛片久久久久久国产毛片| 欧美91在线| 国产精品成人品| 超碰在线观看免费| 亚洲国产欧美一区| 国语对白做受69按摩| 亚洲欧美一区二区在线观看| www.四虎在线| 奇米影视一区二区三区| 国产小视频免费| 宅男在线一区| 97欧洲一区二区精品免费| 女海盗2成人h版中文字幕| 色系列之999| 国模人体一区二区| 色94色欧美sute亚洲线路二 | 九色视频成人自拍| 欧美美女bb生活片| 久久狠狠高潮亚洲精品| 中文字幕乱码一区二区免费| 少妇伦子伦精品无吗| 日韩精品一二区| 成人免费网站入口| 久久综合成人| 国产在线欧美日韩| 95精品视频| 国产成人精品久久二区二区91| 亚洲性图自拍| 在线观看视频99| 日韩一级免费毛片| 777色狠狠一区二区三区| 日韩免费av片| 亚洲人午夜精品天堂一二香蕉| wwwwww日本| 成人一级片网址| 91pony九色| 秋霞午夜鲁丝一区二区老狼| 国产原创中文在线观看| 图片小说视频色综合| 热re99久久精品国产99热| 91大神精品| 亚洲自拍欧美色图| 日韩黄色三级| 国产精品高精视频免费| 成人免费网站观看| 欧美高清在线视频观看不卡| 在线看黄色av| 国产一区二区三区18| 色综合久久网女同蕾丝边| 欧美成人一区二区三区| 97久久人国产精品婷婷| 欧美午夜宅男影院| 久久国产乱子伦精品| 欧美日韩国产中文精品字幕自在自线 | 亚洲丝袜制服诱惑| 伊人影院综合网| 国产调教视频一区| 在线观看福利片| 久久日一线二线三线suv| 亚洲成av人片在线观看无| 国产成人av一区二区三区在线观看| 亚洲欧美日韩精品一区| 久久99精品久久久久久| 99re精彩视频| 久久精品99国产国产精| 污视频网站观看| 蜜臀精品久久久久久蜜臀| 爆乳熟妇一区二区三区霸乳| 日韩黄色一级片| 无码日韩人妻精品久久蜜桃| 久久美女性网| 嫩草av久久伊人妇女超级a| 久久久久久久尹人综合网亚洲| 久久久久久久久久久福利| 亚洲视频www| 丰满少妇被猛烈进入高清播放| aa国产精品| 最近免费中文字幕中文高清百度| 日日摸夜夜添夜夜添国产精品| 免费日韩视频在线观看| 日韩激情一二三区| 亚洲欧美天堂在线| 国产精品123| 国产人妻黑人一区二区三区| 99久久精品免费观看| 久久久久久久久久久国产精品| 91麻豆视频网站| 少妇精品无码一区二区免费视频| 国产精品色眯眯| 欧美一区二区三区爽爽爽| 亚洲最新在线观看| 欧美 日韩 精品| 欧美视频一区在线| 国产三级伦理片| 亚洲电影免费观看| 欧美日韩激情视频一区二区三区| 国产一区二区av| a视频在线观看| 91高清视频免费| 成人国产激情| 北条麻妃高清一区| 天天做夜夜做人人爱精品| 视频一区二区综合| 欧美在线网址| 99热成人精品热久久66| 久久精品国产999大香线蕉| 一级黄色免费视频| 日本一区二区三区国色天香| 少妇影院在线观看| 色天天综合色天天久久| 国产丝袜在线视频| 日韩精品在线免费观看| 久久久久久久久免费视频| 91国在线精品国内播放| 欧美黄色网络| 国新精品乱码一区二区三区18| 精品久久久中文字幕| 成年丰满熟妇午夜免费视频| 欧美一级二区| 最好看的中文字幕| 久久午夜老司机| 免费日韩在线视频| 在线亚洲精品福利网址导航| www.狠狠干| 在线电影中文日韩| 不卡av免费观看| 91精品国产自产在线| 天天躁日日躁成人字幕aⅴ| 免费观看国产视频在线| 三级精品在线观看| 黄色在线免费播放| 亚洲欧美在线视频| 亚洲图片欧美日韩| 亚洲国产欧美一区二区三区久久| 成人福利在线观看视频| 日本欧美精品在线| 欧美男人操女人视频| 红桃一区二区三区| 美腿丝袜亚洲三区| 欧美性xxxx图片| 亚洲一级在线观看| 国产精品高潮呻吟AV无码| 亚洲色图50p| 欧美男男tv网站在线播放| 91aaaa| 国产精品88久久久久久| 老司机午夜av| www国产精品av| 久久国产精品系列| 精品福利一二区| av网站免费在线观看| 国产在线观看精品一区二区三区| 九九在线精品| 激情网站五月天| 91亚洲精品久久久蜜桃| 日韩xxxxxxxxx| 精品三级在线观看| 国产深夜视频在线观看| av一区二区三区在线观看| 国产精品久久久久一区二区三区厕所| 99热手机在线| 日本一区二区不卡视频| 一区二区乱子伦在线播放| 亚洲性av网站| 97人人做人人爽香蕉精品| 欧洲成人一区二区| 日韩高清不卡一区| 日韩影视一区二区三区| 欧美午夜一区二区| 午夜免费播放观看在线视频| 国产免费一区视频观看免费 | 人人妻人人添人人爽欧美一区| 成人在线视频首页| 日韩无码精品一区二区三区| 日韩大片免费观看视频播放| 午夜影院在线播放| 欧美日韩另类综合| 日本成人在线电影网| 潮喷失禁大喷水aⅴ无码| 欧美日韩1234| av大全在线| 国产一区二区三区高清视频| 国产欧美日韩一级| 性欧美13一14内谢| 欧美日韩在线播| bt在线麻豆视频| 国产精品一区二区三区观看| 噜噜爱69成人精品| 农村老熟妇乱子伦视频| 欧美一区三区二区| 黑人玩欧美人三根一起进| 久久久久欧美| 蜜桃av一区二区在线观看| 欧美成人777| 亚洲国产精品久久精品怡红院| 欧美黑人疯狂性受xxxxx野外| 亚洲精品成人a8198a| 国产在线不卡一卡二卡三卡四卡| 久久久久久久久精| 亚洲日本aⅴ片在线观看香蕉| 日韩三级成人| 精品丰满人妻无套内射| 国产欧美日韩中文久久| 99久久精品国产一区色| 97视频在线看| 97精品国产福利一区二区三区| 免费啪视频在线观看| 色噜噜狠狠成人中文综合| 黄色的网站在线观看| 久久99精品久久久久久久青青日本| 视频一区中文字幕| 成年人av电影| 亚洲人成网在线播放| 136福利精品导航| 凹凸日日摸日日碰夜夜爽1| 亚洲日本va午夜在线影院| 色av男人的天堂免费在线| 亚洲精品欧美极品| 久色成人在线| 精品少妇久久久久久888优播| 中文字幕一精品亚洲无线一区|