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

關(guān)于JavaScript閉包的應(yīng)用

開發(fā) 前端
閉包就是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。MDN 上面這么說:閉包是一種特殊的對象。它由兩部分構(gòu)成:函數(shù),以及創(chuàng)建該函數(shù)的環(huán)境。環(huán)境由閉包創(chuàng)建時在作用域中的任何局部變量組成。創(chuàng)建閉包最常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。

[[171507]]

什么是閉包(Closure)

簡單講,閉包就是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。

MDN 上面這么說:閉包是一種特殊的對象。它由兩部分構(gòu)成:函數(shù),以及創(chuàng)建該函數(shù)的環(huán)境。環(huán)境由閉包創(chuàng)建時在作用域中的任何局部變量組成。

但是,網(wǎng)上找了好多資料,它們對閉包的定義也各有各樣,搞得我也不知道怎么去定義閉包了,所以干脆不去定義了,意會吧。

道可道,非常道;名可名,非常名。

產(chǎn)生一個閉包

創(chuàng)建閉包最常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。下面例子中的 closure 就是一個閉包:

  1. function func(){ 
  2.   var a = 1,b = 2; 
  3.    
  4.   function closure(){ 
  5.     return a+b; 
  6.   } 
  7.   return closure; 
  8.  

閉包的作用域鏈包含著它自己的作用域,以及包含它的函數(shù)的作用域和全局作用域。

閉包的注意事項

通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結(jié)束后被銷毀。但是,在創(chuàng)建了一個閉包以后,這個函數(shù)的作用域就會一直保存到閉包不存在為止。

  1. function makeAdder(x) { 
  2.   return function(y) { 
  3.     return x + y; 
  4.   }; 
  5.  
  6. var add5 = makeAdder(5); 
  7. var add10 = makeAdder(10); 
  8.  
  9. console.log(add5(2));  // 7 
  10. console.log(add10(2)); // 12 
  11.  
  12. // 釋放對閉包的引用 
  13. add5 = null
  14. add10 = null 

add5 和 add10 都是閉包。它們共享相同的函數(shù)定義,但是保存了不同的環(huán)境。在 add5 的環(huán)境中,x 為 5。而在 add10 中,x 則為 10。***通過 null 釋放了 add5 和 add10 對閉包的引用。

在javascript中,如果一個對象不再被引用,那么這個對象就會被垃圾回收機制回收;

如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。

閉包只能取得包含函數(shù)中任何變量的***一個值,這是因為閉包所保存的是整個變量對象,而不是某個特殊的變量。

  1. function test(){ 
  2.   var arr = []; 
  3.   for(var i = 0;i < 10;i++){ 
  4.     arr[i] = function(){ 
  5.       return i; 
  6.     }; 
  7.   } 
  8.   for(var a = 0;a < 10;a++){ 
  9.     console.log(arr[a]()); 
  10.   } 
  11. test(); // 連續(xù)打印 10 個 10  

對于上面的情況,如果我們改變代碼如下:

  1. function test(){ 
  2.   var arr = []; 
  3.   for(let i = 0;i < 10;i++){  // 僅在這里作出了改動 
  4.     arr[i] = function(){ 
  5.       return i; 
  6.     }; 
  7.   } 
  8.   for(var a = 0;a < 10;a++){ 
  9.     console.log(arr[a]()); 
  10.   } 
  11. test(); // 打印 0 到 9  

對于上面兩種代碼的解釋,請看我在 segmentfault 上面的提問:鏈接

閉包中的 this 對象

  1. var name = "The Window"
  2.  
  3. var obj = { 
  4.   name"My Object"
  5.    
  6.   getName: function(){ 
  7.     return function(){ 
  8.       return this.name
  9.     }; 
  10.   } 
  11. }; 
  12.  
  13. console.log(obj.getName()());  // The Window  

obj.getName()()實際上是在全局作用域中調(diào)用了匿名函數(shù),this指向了window。這里要理解函數(shù)名與函數(shù)功能(或者稱函數(shù)值)是分割開的,不要認(rèn)為函數(shù)在哪里,其內(nèi)部的this就指向哪里。匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對象通常指向 window。 

  1. var name = "The Window"
  2.  
  3. var obj = { 
  4.   name"My Object"
  5.    
  6.   getName: function(){ 
  7.     var that = this; 
  8.     return function(){ 
  9.       return that.name
  10.     }; 
  11.   } 
  12. }; 
  13.  
  14. console.log(obj.getName()());  // My Object  

閉包的應(yīng)用

應(yīng)用閉包的主要場合是:設(shè)計私有的方法和變量。

任何在函數(shù)中定義的變量,都可以認(rèn)為是私有變量,因為不能在函數(shù)外部訪問這些變量。私有變量包括函數(shù)的參數(shù)、局部變量和函數(shù)內(nèi)定義的其他函數(shù)。

把有權(quán)訪問私有變量的公有方法稱為特權(quán)方法(privileged method)。

  1. function Animal(){ 
  2.    
  3.   // 私有變量 
  4.   var series = "哺乳動物"
  5.   function run(){ 
  6.     console.log("Run!!!"); 
  7.   } 
  8.    
  9.   // 特權(quán)方法 
  10.   this.getSeries = function(){ 
  11.     return series; 
  12.   }; 
  13.  

模塊模式(The Module Pattern):為單例創(chuàng)建私有變量和方法。

單例(singleton):指的是只有一個實例的對象。JavaScript 一般以對象字面量的方式來創(chuàng)建一個單例對象。

  1. var singleton = { 
  2.   name"percy"
  3.   speak:function(){ 
  4.     console.log("speaking!!!"); 
  5.   }, 
  6.   getName: function(){ 
  7.     return this.name
  8.   } 
  9. };  

上面是普通模式創(chuàng)建的單例,下面使用模塊模式創(chuàng)建單例:

  1. var singleton = (function(){ 
  2.    
  3.   // 私有變量 
  4.   var age = 22; 
  5.   var speak = function(){ 
  6.     console.log("speaking!!!"); 
  7.   }; 
  8.    
  9.   // 特權(quán)(或公有)屬性和方法 
  10.   return { 
  11.     name"percy"
  12.     getAge: function(){ 
  13.       return age; 
  14.     } 
  15.   }; 
  16. })();  

匿名函數(shù)***的用途是創(chuàng)建閉包,并且還可以構(gòu)建命名空間,以減少全局變量的使用。從而使用閉包模塊化代碼,減少全局變量的污染。

  1. var objEvent = objEvent || {}; 
  2. (function(){  
  3.     var addEvent = function(){  
  4.       // some code 
  5.     }; 
  6.     function removeEvent(){ 
  7.       // some code 
  8.     } 
  9.  
  10.     objEvent.addEvent = addEvent; 
  11.     objEvent.removeEvent = removeEvent; 
  12. })();  

在這段代碼中函數(shù) addEvent 和 removeEvent 都是局部變量,但我們可以通過全局變量 objEvent 使用它,這就大大減少了全局變量的使用,增強了網(wǎng)頁的安全性。

一個閉包計數(shù)器 

  1. var countNumber = (function(){ 
  2.   var num = 0; 
  3.   return function(){ 
  4.     return ++num; 
  5.   }; 
  6. })();  

閉包的缺陷

  • 閉包的缺點就是常駐內(nèi)存會增大內(nèi)存使用量,并且使用不當(dāng)很容易造成內(nèi)存泄露。
  • 如果不是因為某些特殊任務(wù)而需要閉包,在沒有必要的情況下,在其它函數(shù)中創(chuàng)建函數(shù)是不明智的,因為閉包對腳本性能具有負(fù)面影響,包括處理速度和內(nèi)存消耗。

***再來一些有關(guān)閉包的面試題

下面代碼中,標(biāo)記 ? 的地方輸出分別是什么?

  1. function fun(n,o){ 
  2.   console.log(o); 
  3.   return { 
  4.     fun: function(m){ 
  5.       return fun(m,n); 
  6.     } 
  7.   }; 
  8.  
  9. var a = fun(0);  // ? 
  10. a.fun(1);        // ?         
  11. a.fun(2);        // ? 
  12. a.fun(3);        // ? 
  13.  
  14. var b = fun(0).fun(1).fun(2).fun(3);  // ? 
  15.  
  16. var c = fun(0).fun(1);  // ? 
  17. c.fun(2);        // ? 
  18. c.fun(3);        // ?  
  1. undefined 
  2. undefined, 0, 1, 2 
  3. undefined, 0 
  4.  

參考資料

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2021-02-21 16:21:19

JavaScript閉包前端

2023-09-06 16:55:33

JavaScript閉包

2020-02-12 16:58:15

JavaScript前端技術(shù)

2009-07-24 17:30:37

Javascript閉

2020-10-14 15:15:28

JavaScript(

2011-05-25 14:48:33

Javascript閉包

2023-11-26 00:34:36

Javascript應(yīng)用方法

2010-06-23 10:24:42

Javascript閉

2016-09-18 20:53:16

JavaScript閉包前端

2012-11-29 10:09:23

Javascript閉包

2021-05-28 07:12:59

Python閉包函數(shù)

2017-09-14 13:55:57

JavaScript

2011-05-12 18:26:08

Javascript作用域

2011-03-02 12:33:00

JavaScript

2017-05-22 16:08:30

前端開發(fā)javascript閉包

2021-01-13 11:25:12

JavaScript閉包函數(shù)

2009-03-17 15:36:29

JavaScript循環(huán)事件

2021-12-06 07:15:48

Javascript作用域閉包

2010-06-29 08:39:25

Python閉包

2011-08-24 17:09:35

LUA閉包函數(shù)
點贊
收藏

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

国产日韩免费| 欧美一区 二区| 日本不卡免费一区| 欧美三电影在线| 国产又大又长又粗又黄| 亚洲精品中文字幕成人片| 香蕉久久夜色精品国产使用方法| 精品久久久久久久久久久久久久 | 欧美哺乳videos| 97成人在线免费视频| aaa日本高清在线播放免费观看| 综合激情在线| 日韩电影中文字幕av| av五月天在线| 国内高清免费在线视频| 国产日韩av一区| 91久久精品一区二区别| 国产成人精品777777| 欧美.www| 自拍偷拍亚洲一区| 噜噜噜在线视频| 国内精品视频| 国产精品超碰97尤物18| 国产手机精品在线| 久久免费视频精品| 欧美色婷婷久久99精品红桃| 精品日韩一区二区三区| 亚洲一级片免费| 毛片网站在线观看| 国产成人精品一区二区三区四区| 国产精品91久久久| 四虎永久在线精品| 久久aimee| 婷婷国产v国产偷v亚洲高清| 永久免费在线看片视频| 成年人在线免费观看| av亚洲精华国产精华| 成人免费网视频| 波多野结衣mp4| 亚洲一区视频| 国语自产精品视频在线看抢先版图片| 日本精品一二三| 亚洲男女网站| 欧美三级在线播放| 久久精品网站视频| 亚洲福利影院| 国产欧美日韩精品在线| 久草精品电影| 污污网站免费在线观看| 成人亚洲精品久久久久软件| 91国产在线免费观看| 91亚洲视频在线观看| 免费在线看一区| 国产97免费视| 色噜噜噜噜噜噜| 久久93精品国产91久久综合| 精品偷拍各种wc美女嘘嘘| 色婷婷.com| 成黄免费在线| 久久久久亚洲蜜桃| 欧美亚洲国产免费| 国产午夜在线视频| 国产欧美日韩视频在线观看| 亚洲国产精品一区二区第一页| 国产精品一区在线看| 国产三级精品三级| 在线电影看在线一区二区三区| av大片在线看| 亚洲人成人一区二区在线观看| 2025韩国大尺度电影| bestiality新另类大全| 一级精品视频在线观看宜春院| 青青在线视频免费观看| av成人福利| 欧美日韩激情小视频| 午夜肉伦伦影院| 欧美精品总汇| 777午夜精品免费视频| www.日本久久| 精品精品精品| 亚洲一二三在线| 欧美三级黄色大片| 国产综合欧美| 国产成人精品一区| 国产精品一品二区三区的使用体验| 国产综合色精品一区二区三区| 99久久伊人精品影院| 熟妇高潮一区二区三区| 欧美经典一区二区| 久久福利一区二区| a一区二区三区| 欧美日韩国产首页在线观看| 自拍偷拍激情视频| 蜜桃精品wwwmitaows| 中文字幕在线看视频国产欧美在线看完整 | 九九热国产在线| 中文亚洲字幕| 成人久久一区二区| 污污的视频网站在线观看| 国产精品免费视频观看| 美女黄色免费看| av电影在线观看| 一区二区三区四区在线免费观看| 哪个网站能看毛片| 激情综合五月| 亚洲欧美国产高清va在线播| 99精品一区二区三区无码吞精| 国产免费av国片精品草莓男男| 精品国产亚洲一区二区三区在线观看| www.色天使| 欧美激情亚洲| 国产精品日日摸夜夜添夜夜av| 亚洲av综合色区无码一二三区 | av一区二区三区在线观看| 色猫av在线| 亚洲精品视频在线观看网站| 欧美视频第三页| aaa国产精品| 日韩专区在线播放| 天天干,天天干| 不卡av在线网| 中文字幕在线乱| 国产 日韩 欧美一区| 精品国产第一区二区三区观看体验| 亚洲一区 欧美| 久久久久一区| 日本一区二区不卡| 亚洲av少妇一区二区在线观看| 久久久久国产一区二区三区四区| 欧美精品卡一卡二| 久久男人天堂| 日韩欧美中文一区| 欧美特黄一级片| 日韩高清中文字幕一区| 精品国产一区二区三区麻豆小说| 中文字幕在线三区| 91精品视频网| 色哟哟一一国产精品| 日韩av一区二区三区| 欧洲一区二区在线观看| 涩涩视频网站在线观看| 精品福利二区三区| 久久久精品国产sm调教网站| 国产主播一区二区| 免费在线精品视频| 色999久久久精品人人澡69| 国产香蕉精品视频一区二区三区 | 色综合激情五月| 久草综合在线观看| 天堂99x99es久久精品免费| 高清一区二区三区日本久| www.亚洲欧美| 亚洲激情第一区| 精产国品一区二区三区| 亚洲一区二区日韩| 91在线播放国产| 国产黄色在线免费观看| 51精品久久久久久久蜜臀| 日本黄色免费片| 国产一区在线观看麻豆| 日韩不卡视频一区二区| 日韩欧美一级| 久久久噜噜噜久久| 亚洲 欧美 精品| 日韩欧美一区二区在线| 人妻精品久久久久中文| 亚洲破处大片| 91在线看www| 羞羞的视频在线观看| 亚洲成av人乱码色午夜| 国产一区二区99| 国产亚洲欧美一级| 污版视频在线观看| 亚洲网色网站| 黑人巨大精品欧美一区二区小视频| av在线播放资源| 亚洲欧洲在线观看| 国产又黄又大又粗的视频| 亚洲综合丁香婷婷六月香| 久久人人妻人人人人妻性色av| 久久成人一区| 一本色道久久综合亚洲精品婷婷| 四虎精品永久免费| 性欧美激情精品| 97caocao| 一区二区三区高清| 极品人妻一区二区三区| 久久国产精品99久久久久久老狼| 久久久成人精品一区二区三区| 欧美美女黄色| 国产免费成人av| av不卡高清| 日韩中文字幕在线观看| 三级小视频在线观看| 在线观看一区日韩| 久久精品波多野结衣| 国产三级欧美三级| 老熟女高潮一区二区三区| 日韩成人精品在线| 久久99久久久久久| 日本久久精品| 国产日韩欧美一区二区三区四区| 456成人影院在线观看| 久久91亚洲人成电影网站| 欧美18xxxxx| 日韩欧美中文字幕制服| 超碰在线97观看| 午夜精品成人在线视频| 亚洲不卡的av| 2021国产精品久久精品 | 成人综合婷婷国产精品久久 | 日韩成人中文电影| 国产免费无遮挡| 在线视频你懂得一区二区三区| 久久久久久天堂| 18欧美亚洲精品| 国产伦理片在线观看| 99久久精品一区二区| 九九久久久久久| 日本不卡123| 国产亚洲欧美在线视频| 欧美精品综合| 中文字幕乱码一区二区三区| 国产欧美日韩| 久久精品99久久| 给我免费播放日韩视频| 91网站在线免费观看| 粉嫩av一区二区三区四区五区| 国产91精品久久久久久久| 青青草原av在线| 久久亚洲国产成人| 美女av在线播放| 欧美美女一区二区| 尤物视频免费观看| 欧美日韩在线视频一区二区| 国产亚洲成人av| 一区二区三区在线观看国产| 国产午夜精品理论片| 国产精品美女久久久久久久| 日本精品在线观看视频| 久久久www成人免费无遮挡大片| 国产精品九九视频| 成人动漫视频在线| 屁屁影院国产第一页| 不卡电影免费在线播放一区| 无码人妻丰满熟妇区毛片蜜桃精品 | 青青草久久爱| 好吊色欧美一区二区三区| 老牛精品亚洲成av人片| 国产一区喷水| 台湾佬综合网| 欧洲精品亚洲精品| 不卡中文一二三区| 一区二区精品国产| 亚洲成人tv| 成人在线视频一区二区三区| 欧美日韩日本国产亚洲在线| 日本黄大片在线观看| 1024成人| 色噜噜一区二区| 亚洲精品一区二区三区在线| 91精品国自产在线观看| 福利在线一区| 久久av一区二区三区亚洲| 综合综合综合综合综合网| 青青草成人网| 91视频综合| 成人在线免费高清视频| 在线观看亚洲| 人妻有码中文字幕| 蜜桃av一区二区三区电影| www.com久久久| 国产99久久精品| 亚洲av无码国产精品久久| 国产精品丝袜在线| 91成人福利视频| 天天亚洲美女在线视频| 日韩精选在线观看| 欧美一激情一区二区三区| 亚欧在线观看视频| www.xxxx欧美| 九色91在线| 国产精品第3页| 亚洲高清在线一区| 美媛馆国产精品一区二区| 97精品国产| 国产一区二区三区小说| 日韩在线a电影| 国产在线观看免费播放| 久久久久久电影| 妺妺窝人体色www在线下载| 黑人巨大精品欧美一区二区免费| 中文字幕乱码视频| 欧美精品一区二区在线观看| 二人午夜免费观看在线视频| 欧美国产视频一区二区| 日韩精品麻豆| 国产精品视频免费观看| 菠萝蜜一区二区| 国产精品专区在线| 黄页网站大全一区二区| 国产精品无码一区二区三区免费| 中文字幕中文字幕在线一区| 中文字幕亚洲高清| 欧美乱熟臀69xxxxxx| 午夜福利一区二区三区| 久久夜色撩人精品| 自拍偷自拍亚洲精品被多人伦好爽| 91福利视频导航| 色一区二区三区四区| 久久精品国产精品亚洲色婷婷| 国产主播一区二区三区| 亚洲精品91在线| 五月开心婷婷久久| 国产jzjzjz丝袜老师水多| 国产亚洲欧美aaaa| 51精品视频| 91黄色精品| 99久久婷婷| 亚洲一区二区三区四区五区xx| 成人午夜视频网站| 一区二区视频免费看| 在线观看日韩精品| 深夜福利视频一区| 欧美极品美女电影一区| 91麻豆精品| 翔田千里亚洲一二三区| 美女诱惑黄网站一区| xfplay5566色资源网站| 一区二区在线免费观看| 一卡二卡三卡在线观看| 在线亚洲欧美视频| 性感美女一区二区在线观看| 久久成人资源| 99精品久久| 欧美一区二区免费在线观看| 亚洲制服丝袜在线| wwwav在线播放| 色综合久久悠悠| 日韩精品一区二区三区中文| 黄色一级视频播放| 韩国三级中文字幕hd久久精品| youjizz亚洲女人| 在线日本高清免费不卡| 成年无码av片在线| 草草在线视频| 国产精品久久精品视| 国自产拍偷拍福利精品免费一 | 日韩一区二区三区资源| 久久综合网络一区二区| 国产熟妇久久777777| 色诱视频网站一区| 国产在线观看网站| 国产精品777| 久久一区二区三区电影| 欧美激情第3页| 亚洲精品亚洲人成人网在线播放| 国产a级免费视频| 欧美激情亚洲激情| 久本草在线中文字幕亚洲| 国产91美女视频| 久久久久青草大香线综合精品| 国产精品一区无码| 一区二区欧美日韩视频| 欧美激情不卡| 女女百合国产免费网站| 成人91在线观看| www.国产com| 中文字幕精品在线| 国产剧情一区二区在线观看| 日b视频免费观看| 91在线国内视频| 中文字幕视频一区二区| 久久亚洲国产成人| 另类ts人妖一区二区三区| 成人免费无码av| 中文字幕一区视频| 丰满肉肉bbwwbbww| 国产91热爆ts人妖在线| 婷婷另类小说| 自拍视频一区二区| 欧美三电影在线| av不卡高清| 亚洲欧洲精品在线| 成人网在线免费视频| 免费又黄又爽又猛大片午夜| 日韩亚洲第一页| 久久人人爽人人爽人人片av不| 亚洲一区二区蜜桃| 亚洲一区二区三区视频在线播放| 在线观看中文字幕视频| 亚洲欧美日韩国产精品| 国产精品免费精品自在线观看| 2018日日夜夜| 国产精品福利一区| 婷婷在线免费视频| 国产欧美日韩免费看aⅴ视频| 亚洲香蕉网站| 国产中文字幕久久| 亚洲精品动漫久久久久|