1. 程式人生 > >js閉包的理解-目前網上分析的最透徹文章

js閉包的理解-目前網上分析的最透徹文章

js的閉包對於大家實際上並不陌生,但是真正敢說自己完全理解的人並不多。筆者在網上看到分析閉包的文章非常多,篇幅用的非常多,但是實際上分析的並不到位,或者根本就是不正確的。我有時候都在想,寫這些文章的人自己未必真的理解了。今天我就為大家說到說到js的閉包,看完你百分百的能夠理解。

說閉包之前,我們先要說一個js的概念

js的變數不是傳統意義的變數,是一個廣義的概念

例如:

1、var i=0;

2、var str="china";

3、var fun=function(){...}

第1個和第2個大家非常好理解,第3個簡單的解釋一下,它代表的是一個函式表示式,看到了嗎?變數可以是一個函式,它實際上就是一個函式,要使用它直接就是fun();

如果想要了解更多的函式表示式的概念,大家可以去查一下相關資料,網上資料很多,也很容易看得懂。我就不多說了,OK!我講閉包之前先要掌握的概念就是這麼多!

進入正題:

網上使用最多的一個例子如:

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = function(){
            return i;                            
        }                                        
    }                                            
    
return arr; }

網上的分析各種詭異看不懂,我直接給出我的結論,呼叫box()後,我們得到了一個數組,陣列中是一個一個的函式表示式:

[

   function(){return i},

   function(){return i},

   function(){return i},

   function(){return i},

   function(){return i}

]

大家不要懵逼,這裡很容易理解,我們看這裡,在給陣列arr賦值的時候,本來就是賦值的一個函式表示式

arr[i] = function(){ return i; }

大家明白了吧,你自己完全也可以使用alert(box());列印結果進行驗證,大家可能還有一點兒疑惑,我要的是值,不是表示式啊,很簡單,獲取函式表示式的值只需要在變數後面加一個(),所以

alert(box()[0]());結果是5,因為變數i現在的值是5,所以陣列中的值都是5.就這麼簡單!

閉包可以幹什麼?閉包可以讓外部訪問內部的區域性變數

還是以一個例子來解釋:

function test(){
var i=6;
return i;
}

這就是一個最簡單的閉包,區域性變數通過函式返回。其它的應用都是類似,萬變不離其宗!