日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JavaScript中閉包的概念、原理、作用及應(yīng)用

 一、閉包概念

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、五峰ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的五峰網(wǎng)站制作公司

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

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

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

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

那閉包是怎樣的一個表現(xiàn)形式呢?

第一,閉包是一個函數(shù),而且存在于另一個函數(shù)當(dāng)中

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

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

二、閉包原理

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

例如:

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

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

如果我們再次調(diào)用時,結(jié)果會一直增加,也就變量age的值一直遞增。

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

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

 
 
 
 
  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 

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

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

而且變量age在函數(shù)內(nèi)部,不易修改和外泄,相對來說比較安全。

三、閉包作用

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

作用2:可以讀取函數(shù)內(nèi)部的變量

同時閉包使用不當(dāng),優(yōu)點就變成了缺點:

缺點1:導(dǎo)致變量不會被垃圾回收機制回收,造成內(nèi)存消耗

缺點2:不恰當(dāng)?shù)氖褂瞄]包可能會造成內(nèi)存泄漏的問題

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

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

四、閉包應(yīng)用

需求:實現(xiàn)變量a 自增

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

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

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

 
 
 
 
  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、通過閉包,可以是函數(shù)內(nèi)部局部變量遞增,不會影響全部變量,完美!!

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

網(wǎng)站名稱:JavaScript中閉包的概念、原理、作用及應(yīng)用
網(wǎng)頁URL:http://www.dlmjj.cn/article/coieidd.html