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

Javascript的作用域和閉包知多少?

開發 前端
在Javascript編程中,閉包是個相當重要且難以理解的概念,并且與作用域知識是密切相關的。

[[438672]]

本文轉載自微信公眾號「前端萬有引力」,作者一川。轉載本文請聯系前端萬有引力公眾號。

1寫在前面

在Javascript編程中,閉包是個相當重要且難以理解的概念,并且與作用域知識是密切相關的。那么:

  • Javascript中的作用域是什么意思呢?
  • 閉包會在哪些場景中使用呢?
  • 通過定時器循環輸出自增的數字,通過JS代碼如何實現呢?

2作用域

作用域:指的是變量的作用范圍,即變量能夠被訪問到的范圍。

es5之前只有:全局作用域和函數作用域

es6之后新增:塊級作用域

2.1 全局作用域

在Javascript中,全局變量是掛載到window頂級對象下的變量,因此在網頁中的任何位置都可以進行使用,并且可以訪問到這個全局變量。

  1. function getName(){ 
  2.   var name = "inner"
  3.   console.log(name);//"inner" 
  4.  
  5. getName(); 
  6. console.log(name);//name is not defined 

使用全局變量的缺點是:定義很多全局變量的時候,會容易引起變量命名的沖突。因此定義全局變量的時候,要注意作用域的訪問范圍。

2.2 函數作用域

函數作用域:除了函數內部能夠進行訪問外,其他地方都是不能夠訪問的。且此函數執行完畢后,定義在函數作用域的局部變量也會被銷毀。

  1. function getName(){ 
  2.   var name = "inner"
  3.   console.log(name);//"inner" 
  4.  
  5. getName(); 
  6. console.log(name);//name is not defined 

2.3 塊級作用域

塊級作用域最直接的表現是:新增的let關鍵字,使用let關鍵字定義的變量只能在塊級作用域中被訪問。這是因為其具有暫時性死區的特點:這個變量在定義之前是不能夠被使用的。

在Javascript中,if語句、try...catch...、switch以及for等語句后面{...}里面所包括的都是塊級作用域。

  1. console.log(name);//name is not defined 
  2. if(true){ 
  3.   let name = "yichuan"
  4.   console.log(name);//"yichuan" 
  5. console.log(name);//name is not defined 

3閉包

在《Javscript高級程序設計》中是這樣定義閉包的:閉包指有權訪問另外一個函數作用域中的變量的函數。

在MDN中是這樣定義的:一個函數和對其周圍狀態(lexical environment,詞法環境)的引用捆綁在一起(或者說函數被引用包圍),這樣的組合就是閉包(closure)。也就是說,閉包讓你可以在一個內層函數中訪問到其外層函數的作用域。在 JavaScript 中,每當創建一個函數,閉包就會在函數創建的同時被創建出來。

對于我們理解,其實閉包就是一個可以訪問其它函數內部變量的函數。

通常情況下,函數內部變量是無法在函數外部進行訪問的,因此使用閉包的作用就是突破這種限制,使得具備了能夠在函數外部訪問此函數內部變量的功能。

  1. function func1(){ 
  2.   var name = "yichuan"
  3.   return function(){ 
  4.     console.log(name); 
  5.   } 
  6.  
  7. func1();//此處返回的是一個function函數 
  8. var result = func1();//使用result接收這個return出來的函數 
  9. result();//1 

我們看上面的代碼其實就已經具有閉包的特點,就是可以在func函數外部去訪問name的值。

我們分析下閉包產生的原因,這就需要先理解什么是作用域鏈。

作用域鏈:當訪問一個變量時,代碼解釋器會首先在當前作用域進行查找,如果沒有查找到,就會去父級作用域進行查找,知道找到該變量或者不存在父級作用域中。

  1. var name = "outer"
  2. console.log(name);//outer 
  3. function func1(){ 
  4.   var name = "inner"
  5.   console.log(name);//inner 
  6.   function func2(){ 
  7.     var name = "self"
  8.     console.log(name);//self 
  9.   } 
  10.   function func3(){ 
  11.     console.log(name);//inner 
  12.   } 
  13.   func2(); 
  14.   func3(); 
  15.  
  16. function func4(){ 
  17.   function func5(){ 
  18.     console.log(name);//outer 
  19.   } 
  20.  
  21. func1(); 
  22. func4(); 

我們看到,在函數func2中使用name變量,他會現在func2中查找到name變量并使用它的值。在函數func3中沒有name變量,它就會沿著作用域鏈向上查找到func1函數中的name變量并使用。在函數func5中,查找并沒有name變量,它就會去func4函數中查找也沒有,就接著去全局變量查找到name變量并使用。

閉包產生本質就是:當前環境中存在指向父級作用域的引用。

  1. function func1(){ 
  2.   var name = "inner"
  3.   function func2(){ 
  4.     console.log(name);//inner 
  5.   } 
  6.   return func2; 
  7. var result = func1(); 
  8. result(); 

是不是只有返回函數的形式才能說產生了閉包呢?當然不是呀,只要讓父級作用域的引用存在即可。

  1. var func2; 
  2. function func1(){ 
  3.   var name = "yichuan"
  4.   func2 = function(){ 
  5.     console.log(name); 
  6.   } 
  7. func1(); 
  8. func2();//"yichuan" 

所以閉包有哪些表現形式呢?

  • 直接返回一個函數
  • 在定時器、事件監聽、ajax請求、web workers或者任何異步中只要使用到了回調函數,實際上就是在使用閉包
  • 作為函數參數傳遞的形式
  • 立即執行函數IIFE,創建了閉包,保存了全局作用域window和當前函數作用域,因此可以輸出全局的變量
  1. //定時器 
  2. setTimeout(function(){ 
  3.   console.log("yichuan"); 
  4. },1000); 
  5.  
  6. //事件監聽 
  7. const container = document.getElementById("app"); 
  8. container.addEventListener("click",function(){ 
  9.   console.log("event listener"); 
  10. }); 
  11.  
  12. //函數參數傳遞 
  13. var name = "yichuan"
  14. function func1(){ 
  15.   var name = "onechuan"
  16.   function func2(){ 
  17.     console.log(name); 
  18.   } 
  19.   func3(func2); 
  20.  
  21. function func3(func){ 
  22.   func();//閉包 
  23. func1();//輸出"onechuan" 
  24.  
  25. //立即執行函數 
  26. var name = "yihchuan"
  27. (function(){ 
  28.    console.log(name);//"yichuan" 
  29. })(); 

那么,我們應該如何應用閉包解決循環問題呢?

4面試中??嫉难h打印問題

例如:在循環中是否是期望的,打印出來的是1、2、3、4、5呢?

  1. for(var i = 1; i <= 5; i++){ 
  2.   setTimeout(function(){ 
  3.     console.log(i); 
  4.   },0); 

答案是否定的,最終打印出來是五個6。這是為什么呢?

這是因為:setTimeout是宏任務,由于js中單線程EventLoop機制,在主線程同步任務執行完畢后才會去執行宏任務,因此循環結束后setTimeout中的回調才會依次執行。而setTimeout函數也是一種閉包,沿著作用域鏈往上找它的父級作用域就是window,而變量i是window上的全局變量。等開始執行setTimeout函數之前變量i就已經變成了6了,因此最后輸出的數值就是5個6。

那么如何解決呢?

  1. //使用立即執行函數 
  2. for(var i = 1; i <= 5; i++){ 
  3.   (function(j){ 
  4.     setTimeout(function(){ 
  5.       console.log(j); 
  6.     },0); 
  7.   })(i) 
  8.  
  9. //使用es6中let 
  10. for(let i = 1; i <= 5; i++){ 
  11.   setTimeout(function(){ 
  12.     console.log(i); 
  13.   },0); 

還有個很難想到的方法,就是使用setTimeout的隱藏的第三個參數。

  1. for(var i = 1; i <= 5; i++){ 
  2.   setTimeout(function(){ 
  3.     console.log(i); 
  4.   },0,i); 

附加參數,一旦定時器到期,它們會作為參數傳遞給function。但是得注意:IE9 及更早的 IE 瀏覽器不支持向回調函數傳遞額外參數(第一種語法)。

5參考文章

《Javascript核心原理精講》

《MDN》

《Javascript高級程序設計》

6寫在后面

閉包的使用在日常的javascript編程中經常出現,使用的場景比較多且復雜,需要讀者仔細分析。本篇文章講到了關于作用域和閉包的知識,其中作用域根據變量的作用范圍分為:全局作用域、函數作用域以及塊級作用域。而閉包就是一個可以訪問其它函數內部變量的函數,在解決for循環打印的問題可以使用立即執行函數、setTimeout的第三參數、es6中的let關鍵字解決。

注意:閉包在實際開發要注意不要濫用,容易引起內存泄漏。

 

責任編輯:武曉燕 來源: 前端萬有引力
相關推薦

2017-09-14 13:55:57

JavaScript

2011-05-12 18:26:08

Javascript作用域

2020-12-16 11:09:27

JavaScript語言開發

2021-12-04 11:17:32

Javascript繼承編程

2021-12-10 07:47:30

Javascript異步編程

2015-08-18 13:42:42

js作用域鏈變量

2020-02-12 16:58:15

JavaScript前端技術

2021-12-11 18:59:35

JavascriptJSON應用

2011-09-06 09:56:24

JavaScript

2019-03-13 08:00:00

JavaScript作用域前端

2021-12-03 15:24:45

Javascript數據類型

2021-02-21 16:21:19

JavaScript閉包前端

2021-12-05 08:27:56

Javascript 高階函數前端

2021-12-07 08:01:33

Javascript 垃圾回收機制前端

2016-09-14 09:20:05

JavaScript閉包Web

2009-07-24 17:30:37

Javascript閉

2011-05-25 14:48:33

Javascript閉包

2020-10-14 15:15:28

JavaScript(

2021-03-09 08:50:58

JavaScript前端作用域

2016-09-18 20:53:16

JavaScript閉包前端
點贊
收藏

51CTO技術棧公眾號

日韩欧美主播在线| 成人黄色小视频在线观看| 一道本无吗dⅴd在线播放一区| 成人性做爰aaa片免费看不忠| 国产69久久| 国产美女在线精品| 97在线视频精品| 男人的天堂官网| 国产亚洲精aa在线看| 精品福利在线视频| 亚洲一区bb| 三级网站免费观看| 蜜臀久久久久久久| 97成人在线视频| 成人性生活毛片| 台湾色综合娱乐中文网| 欧美高清www午色夜在线视频| 青青在线免费观看| 日本美女在线中文版| k8久久久一区二区三区| 国产日产欧美a一级在线| 欧美成人精品一区二区免费看片 | 欧美在线不卡区| 99热99这里只有精品| 青草久久视频| 日韩欧美高清一区| 日韩爱爱小视频| 高清精品在线| 亚洲精品国产无天堂网2021 | 九九热99视频| 五月天av在线| 一区二区三区欧美日韩| 亚洲欧洲一区二区在线观看| 少妇性bbb搡bbb爽爽爽欧美| 国产精品综合二区| 成人精品aaaa网站| 小泽玛利亚一区二区三区视频| 在线观看一区视频| 九九热视频这里只有精品| 国产精品久久国产精麻豆96堂| 五月综合久久| 精品国产乱码久久久久久久| 午夜福利123| 福利精品在线| 欧美丝袜丝交足nylons图片| 男人揉女人奶房视频60分| 国产精品探花在线| 亚洲免费大片在线观看| 中文字幕一区二区中文字幕| 国产午夜精品一区理论片| 久久色.com| 欧美精品123| 亚洲av成人无码久久精品老人 | 国产高清在线| 久久亚洲免费视频| 欧美 日韩 国产在线| 午夜视频www| 91蝌蚪国产九色| 久久久久久久久久久久久久久久av | 欧美扣逼视频| 久久综合久色欧美综合狠狠| 精品在线一区| 日韩av资源站| 国产亚洲女人久久久久毛片| 欧美一区激情视频在线观看| 色猫av在线| 久久亚洲私人国产精品va媚药| 欧美日韩精品免费观看视一区二区| 香蕉av一区二区三区| 91网站视频在线观看| 精品一区2区三区| 欧美一区二区三区少妇| 国产亚洲精久久久久久| 日韩在线三区| 黄网站app在线观看| 亚洲黄色免费网站| 日韩五码在线观看| 亚洲第一av| 欧美优质美女网站| 在线观看免费不卡av| 日本精品视频| 亚洲精品在线电影| 丰腴饱满的极品熟妇| 日韩综合一区| 欧美黄色片免费观看| 4438国产精品一区二区| 精品在线你懂的| 国产精品对白刺激久久久| 神马久久久久| 国产精品全国免费观看高清| 91视频成人免费| 川上优av中文字幕一区二区| 91九色02白丝porn| 日本亚洲一区二区三区| 国内精品偷拍| 深夜福利日韩在线看| 久久久精品国产sm调教网站| 午夜亚洲性色视频| 成人黄色av播放免费| 天天爱天天干天天操| 国产精品丝袜在线| 男人添女荫道口女人有什么感觉| 一区二区三区短视频| 制服丝袜中文字幕一区| 99久久人妻精品免费二区| 久久在线视频免费观看| 国语对白做受69| 欧美激情一区二区三区免费观看| 国产福利一区二区| 日本日本精品二区免费| 色呦呦在线播放| 91久久精品一区二区| 亚洲av永久无码精品| 日韩综合精品| 国产成一区二区| 成人乱码一区二区三区| 国产精品三级视频| 99热成人精品热久久66| 亚洲网址在线观看| 最新的欧美黄色| 手机在线看片1024| 成人午夜免费av| 精品一区二区成人免费视频| 电影一区二区三| 精品国产人成亚洲区| 国产精品成人69xxx免费视频| 久久久xxx| 国产伦精品一区二区三区免费视频 | 青青草久久网络| 乱插在线www| 91精品国产综合久久精品图片 | 麻豆精品av| 久热精品在线视频| 超碰在线97观看| 91丨porny丨国产入口| 人妻少妇精品久久| 亚洲一区 二区| 久久躁日日躁aaaaxxxx| 一个人看的www日本高清视频| 2021久久国产精品不只是精品| 成人网站免费观看入口| 中文字幕亚洲在线观看| 美女久久久久久久| 国产又粗又猛又爽又黄的| 欧美国产成人在线| 天堂av在线网站| av中文一区| 国产精品第一页在线| 国产一二在线观看| 日本高清不卡aⅴ免费网站| 国产人妻人伦精品1国产丝袜| 黑人一区二区三区四区五区| 亚洲综合自拍一区| 91国内在线| 日韩一区二区在线看片| 黑鬼狂亚洲人videos| 国内精品久久久久影院一蜜桃| 一区二区视频国产| va天堂va亚洲va影视| 久久精品国产一区| aaa一区二区| 亚洲午夜精品在线| 国产精品一区二区无码对白| 亚洲人成在线影院| 久久久一本精品99久久精品66| 极品在线视频| 亚洲视频视频在线| 中文字幕精品一区二| 国产精品久久久久9999吃药| 欧美特黄aaa| 久久久久久影院| 动漫一区二区在线| 亚洲欧洲美洲av| 在线观看久久av| 国产又粗又猛又爽又黄的视频一| 亚洲另类中文字| 成年女人免费视频| 鲁大师成人一区二区三区| 日韩精品电影网站| 91麻豆精品国产91久久久更新资源速度超快| 俺也去精品视频在线观看| 午夜精品久久久久久久爽 | www.国产com| 国产女人18毛片水真多成人如厕| www.夜夜爽| 欧美视频二区| 日韩av一区二区三区美女毛片| 欧美天堂一区| 欧美激情精品久久久久久黑人| 欧美日韩性生活| 一级特黄妇女高潮| 一区二区三区在线免费看 | 天天摸日日摸狠狠添| 激情伊人五月天久久综合| 少妇大叫太大太粗太爽了a片小说| 久久精品色综合| 国产精品自拍小视频| 黑人玩欧美人三根一起进| 亚洲欧美制服第一页| 国产免费不卡视频| 欧美性色19p| 久久久久久久久久久久久女过产乱| 26uuu国产电影一区二区| 天天综合天天添夜夜添狠狠添| 亚洲国产第一| 亚洲综合av一区| 日本福利一区| 51成人做爰www免费看网站| 波多视频一区| 欧美激情一区二区三区高清视频 | 红桃一区二区三区| 伊人久久大香线蕉综合网站| 亚洲自拍av在线| 欧美成a人片在线观看久| 欧美肥老妇视频| h网站视频在线观看| 亚洲大胆人体视频| 一级黄色片免费| 色香蕉成人二区免费| 国产一级做a爱免费视频| 亚洲色图制服诱惑| 女人黄色一级片| 91视频国产资源| 动漫av在线免费观看| 久久99国产精品免费网站| 精品国产成人av在线免| 99成人精品| 女人被男人躁得好爽免费视频| 日韩综合一区| 色狠狠久久av五月综合|| 久久精品色综合| 成人av中文| 国产aⅴ精品一区二区四区| 国产精品大陆在线观看| 亚洲三级欧美| 97免费在线视频| 羞羞的视频在线观看| 日韩中文字幕av| 岛国视频免费在线观看| 日韩精品视频在线观看免费| 欧美天堂在线视频| 精品成人一区二区三区| 国产高清视频免费| 欧美一个色资源| 99热这里是精品| 日韩一区二区视频在线观看| 一区二区www| 5月丁香婷婷综合| 亚洲在线免费观看视频| 欧美日韩视频在线第一区 | 美女黄视频在线观看| 在线成人中文字幕| 日本电影在线观看网站| 深夜福利一区二区| 黄色精品在线观看| 欧美成人午夜激情| 女女色综合影院| 久久国产精品久久久久久久久久| 国产在线观看91| 久久99久久99精品中文字幕| 欧美人体视频xxxxx| 久久人人爽人人| 超碰99在线| 欧美性资源免费| 久久r热视频| 国产日产欧美a一级在线| 国产不卡精品| 国产伦精品一区| 亚洲丝袜美腿一区| 少妇免费毛片久久久久久久久| 日韩免费av| 肉大捧一出免费观看网站在线播放 | 肉丝袜脚交视频一区二区| 国产精品无码一本二本三本色| 人人爽香蕉精品| 图片区乱熟图片区亚洲| 国产成人精品午夜视频免费| www.男人天堂| 久久精品视频网| 肉色超薄丝袜脚交69xx图片| 一区二区三区中文在线| 国产又爽又黄的视频| 欧洲在线/亚洲| 国产女同91疯狂高潮互磨| 亚洲福利视频久久| 国产精品免费播放| 久久成人一区二区| 性感女国产在线| 成人网在线观看| 欧美三级电影在线| 亚洲精品成人三区| 亚洲国产高清一区二区三区| 免费看a级黄色片| 国产成人精品亚洲777人妖| 成年人网站免费在线观看 | 亚洲第一精品自拍| 国产精品一区二区三区四区色| 欧美精品在线播放| 欧美精品日日操| 92看片淫黄大片看国产片| 亚洲黄页在线观看| 影音先锋成人资源网站| 可以免费看不卡的av网站| 永久看看免费大片| 国产午夜精品一区二区| 国产亚洲欧美精品久久久久久 | 免费在线激情视频| 国内精品在线播放| 级毛片内射视频| 亚洲福中文字幕伊人影院| 色婷婷久久综合中文久久蜜桃av| 亚洲成人免费网站| 91露出在线| 欧美中文字幕精品| 日本一区二区三区视频在线看 | 国产中文字幕在线看| 久久99热精品| 国产精品天堂蜜av在线播放| 国产一区二区中文字幕免费看| 97精品97| 日韩欧美黄色大片| 91麻豆蜜桃一区二区三区| 性欧美videos| 欧美日韩一级片网站| 欧美老女人性开放| 26uuu久久噜噜噜噜| 99精品中文字幕在线不卡| 中文字幕免费在线不卡| 视频一区二区三区入口| av网站有哪些| 亚洲成va人在线观看| 国产高清在线免费| 久久亚洲精品中文字幕冲田杏梨| 欧美aaa大片视频一二区| 精品久久久久久一区| 一区在线视频观看| 女女调教被c哭捆绑喷水百合| 国产精品国产三级国产专播品爱网| 99精品人妻国产毛片| 亚洲精品国精品久久99热| 黄网站在线观| www.成人av.com| 欧美精品日韩| 亚洲欧美综合视频| 亚洲高清免费在线| 五月天激情婷婷| 欧美精品videosex极品1| xxxx日韩| 国产黄色片免费在线观看| 成人国产亚洲欧美成人综合网| 青青草激情视频| 日韩欧美国产不卡| 波多野结衣精品| 精品国产免费一区二区三区| 136国产福利精品导航网址| 久久久久亚洲AV成人无码国产| 亚洲国产成人av网| 熟妇高潮一区二区三区| 91av在线国产| 国产精品欧美在线观看| 久草综合在线观看| 国产精品毛片久久久久久久| 一区二区的视频| 精品少妇v888av| av综合网页| 91传媒久久久| 国产午夜精品久久久久久免费视 | 国产日韩免费| 中文人妻一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃 | 26uuu亚洲综合色| 久久久久女人精品毛片九一| 夜夜嗨av一区二区三区四区| 欧美成人免费全部网站| 女女百合国产免费网站| 成人妖精视频yjsp地址| 国产 日韩 欧美 在线| 亚洲最新av网址| 国产一区二区三区视频在线| 国产精品国三级国产av| 91麻豆福利精品推荐| 国产一区二区在线不卡| 欧美精品videosex牲欧美| 久久爱www成人| 久久人人爽av| 亚洲午夜精品网| 欧美xxx.com| 91青草视频久久| a91a精品视频在线观看| 免费成人深夜天涯网站| 精品乱人伦小说| 欧美与亚洲与日本直播| 色婷婷777777仙踪林| 91在线丨porny丨国产| 伊人精品一区二区三区| 欧美国产日韩一区| 精品黄色一级片| 日本黄色一级网站| 在线免费亚洲电影| 婷婷在线播放|