JS閉包函數


閉包的理解

所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。

下面來看一個例子:

function a(){  
    var tmp=1;  
    return function a_sub(x){  
       alert(x+(tmp++));  
    }  
}  
  
var b = a;      //此處a和b是一模一樣的,b是從a拷貝了一份過去  
var c1 = a();   //此處a加上了括號,於是c1的函數其實就是 a中return回來的函數(此函數可以調用a外面的變量tmp)  
var c2 = b();   //為了證明a和b是同樣的功能,且是復制了一份  
c1(3);    //輸出4  
c1(3);    //輸出5,——說明a並內存並未釋放  
  
c2(3);    //輸出4——說明a和b是復制關系(兩個獨立的對象),內存中互相獨立  

這段代碼有幾個注意點:

  1、函數a_sub嵌套在函數a內部;

  2、函數a返回函數a_sub。

  3、a和b是同樣的函數功能

  4、obj=a和obj=a()是不一樣的

  這樣在執行完c1\c2后,變量c實際上是指向了函數a的內嵌函數a_sub,再執行c1()后就會彈出一個窗口顯示i的值。這段代碼其實就創建了一個閉包,為什么?因為函數a外的變量c引用了函數a內的函數a_sub,就是說:

  當函數a的內部函數a_sub被函數a外的一個變量引用的時候(如c1\c2,而不是b),就創建了一個閉包。

閉包的用途:

  相同函數可以用多個相互獨立的對象引用,避免代碼冗余、相互污染。閉包函數實際是做的全局變量的功能,在大型項目中,不適用閉包函數的話,相同功能的函數,我們就需要多次創建新的函數,否則同時調用一個函數,不僅會造成后面的函數不能正常使用,如果改動了全局變量,還會對前面正常的函數產生影響、造成污染。因此我們需要用到閉包。而且可以使代碼簡單化,體積小。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM