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; }
這就是一個最簡單的閉包,區域性變數通過函式返回。其它的應用都是類似,萬變不離其宗!