成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript中閉包的概念、原理、作用及應用

開發 前端
閉包:有權訪問另一個函數作用域中的變量的函數;一般情況就是在一個函數中包含另一個函數。

 一、閉包概念

閉包:有權訪問另一個函數作用域中的變量的函數;一般情況就是在一個函數中包含另一個函數。

[[314779]]

從官方定義我們知道閉包是一個函數,只不過這個函數有[超能力],可以訪問到另一個函數的作用域。

為什么說這個叫做[超能力]呢?

因為我們知道函數作用域是獨立的、封閉的,外部的執行環境是訪問不了的,但是閉包具有這個能力和權限。

那閉包是怎樣的一個表現形式呢?

第一,閉包是一個函數,而且存在于另一個函數當中

第二,閉包可以訪問到父級函數的變量,且該變量不會銷毀

  1. function person(){ 
  2.     var name = '有魚'
  3.     function cat(){ 
  4.         console.log(name); 
  5.     } 
  6.     return cat; 
  7. var per = person();// per的值就是return后的結果,即cat函數 
  8. per();// 有魚 per()就相當于cat() 
  9. per();// 有魚 同上,而且變量name沒有銷毀,一直存在內存中,供函數cat調用 
  10. per();// 有魚 

 

二、閉包原理

閉包的實現原理,其實是利用了作用域鏈的特性,我們都知道作用域鏈就是在當前執行環境下訪問某個變量時,如果不存在就一直向外層尋找,最終尋找到最外層也就是全局作用域,這樣就形成了一個鏈條。

例如:

 

  1. var age = 18; 
  2. function cat(){ 
  3.     age++; 
  4.     console.log(age);// cat函數內輸出age,該作用域沒有,則向外層尋找,結果找到了,輸出[19]; 
  5. cat();//19 

 

看到這里,大家都會說這不就是最簡單的函數和變量形式嗎?閉包在哪里?別急,我們接著往下看:

如果我們再次調用時,結果會一直增加,也就變量age的值一直遞增。

 

  1. cat();//20 
  2. cat();//21 
  3. cat();//22 

 

如果程序還有其他函數,也需要用到age的值,則會受到影響,而且全局變量還容易被人修改,比較不安全,這就是全局變量容易污染的原因,所以我們必須解決變量污染問題,那就是把變量封裝到函數內,讓它成為局部變量。

 

  1. function person(){ 
  2.     var age = 18; 
  3.     function cat(){ 
  4.         age++; 
  5.         console.log(age); 
  6.     } 
  7.     return cat; 
  8. person();// 19 
  9. person();// 19 

 

這里又出現問題了,每次調用函數person,進入該作用域,變量age就會重新賦值為18,所以cat的值一直是19;所以需要做一下調整:

 

  1. var per = person();//per相當于函數cat 
  2. per();// 19 即cat() 這樣每次調用不在經過age的初始值,這樣就可以一直增加了 
  3. per();// 20 
  4. per();// 21 

 

而且變量age在函數內部,不易修改和外泄,相對來說比較安全。

三、閉包作用

作用1:隱藏變量,避免全局污染

作用2:可以讀取函數內部的變量

同時閉包使用不當,優點就變成了缺點:

缺點1:導致變量不會被垃圾回收機制回收,造成內存消耗

缺點2:不恰當的使用閉包可能會造成內存泄漏的問題

這里簡單說一下,為什么使用閉包時變量不會被垃圾回收機制收銷毀呢,這里需要了解一下JS垃圾回收機制;

JS規定在一個函數作用域內,程序執行完以后變量就會被銷毀,這樣可節省內存;使用閉包時,按照作用域鏈的特點,閉包(函數)外面的變量不會被銷毀,因為函數會一直被調用,所以一直存在,如果閉包使用過多會造成內存銷毀。

 

四、閉包應用

需求:實現變量a 自增

1、通過全局變量,可以實現,但會污染其他程序

 

  1. var a = 10; 
  2. function Add(){ 
  3.     a++; 
  4.     console.log(a); 
  5. Add(); 
  6. Add(); 
  7. Add(); 

 

2、定義一個局部變量,不污染全局,但是實現不了遞增

 

  1. var a = 10; 
  2. function Add2(){ 
  3.     var a = 10; 
  4.     a++; 
  5.     console.log(a); 
  6. Add2(); 
  7. Add2(); 
  8. Add2(); 
  9. console.log(a); 

 

3、通過閉包,可以是函數內部局部變量遞增,不會影響全部變量,完美!!

 

  1. var a  = 10; 
  2. function Add3(){ 
  3.     var a = 10; 
  4.     return function(){ 
  5.         a++; 
  6.         return a; 
  7.     }; 
  8. }; 
  9. var cc =  Add3(); 
  10. console.log(cc()); 
  11. console.log(cc()); 
  12. console.log(cc()); 
  13. console.log(a); 

 

責任編輯:華軒 來源: segmentfault
相關推薦

2011-05-12 18:26:08

Javascript作用域

2017-09-14 13:55:57

JavaScript

2016-09-14 09:20:05

JavaScript閉包Web

2010-06-29 08:39:25

Python閉包

2021-12-06 07:15:48

Javascript作用域閉包

2012-11-29 10:09:23

Javascript閉包

2021-10-26 13:18:52

Go底層函數

2021-02-21 16:21:19

JavaScript閉包前端

2020-12-16 11:09:27

JavaScript語言開發

2009-07-24 17:30:37

Javascript閉

2020-10-14 15:15:28

JavaScript(

2011-05-25 14:48:33

Javascript閉包

2009-10-26 09:41:26

PHP5.3閉包特性

2023-11-26 00:34:36

Javascript應用方法

2023-10-26 07:47:35

JavaScript代碼變量

2010-06-23 10:24:42

Javascript閉

2016-09-18 20:53:16

JavaScript閉包前端

2022-10-24 08:08:27

閉包編譯器

2023-09-06 16:55:33

JavaScript閉包

2011-03-02 12:33:00

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕av亚洲精品一部二部 | 精品国产一区一区二区三亚瑟 | 国产高清视频一区二区 | 一级欧美视频 | 亚洲欧美少妇 | 色姑娘av | 亚洲成av人片在线观看 | 免费在线视频一区二区 | 国产精品亚洲成在人线 | 欧美日韩在线综合 | 黑人性hd | 亚洲国产69 | 在线免费看毛片 | 一区二区三区视频免费观看 | 国产精品123区 | 一区二区三区四区在线视频 | 欧美精品99 | 黄毛片| 精品亚洲一区二区三区四区五区 | 91亚洲精华国产 | av一区二区三区四区 | 亚洲精选一区二区 | 国产免费让你躁在线视频 | a久久| 国产精品一区二 | 亚洲国产网 | 国产一区二区 | 全免一级毛片 | 欧美中文一区 | 国产精品久久久久久二区 | 涩涩视频大全 | av一区二区三区 | 国产日韩一区二区 | 日韩精品免费视频 | 夜操 | 欧美极品一区二区 | 五月综合激情婷婷 | 正在播放国产精品 | 欧美成人综合 | 国产永久免费 | 自拍第1页|