“官方”的解釋是:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù))腿宰,因而這些變量也是該表達式的一部分弟蚀。反正我是沒看懂,因為描述的太學術(shù)酗失。直接上例子吧,
function out(){
var i=0;
function inside(){
console.log(++i);
}
return inside;
}
var o=out();
o();//1
o();//2
這段代碼有兩個特點:
1昧绣、函數(shù)inside嵌套在函數(shù)out內(nèi)部规肴;
2、函數(shù)out返回函數(shù)inside。
這樣在執(zhí)行完var o=out( )后拖刃,其中删壮,o的值就是內(nèi)部定義的函數(shù)inside,可是兑牡,多次調(diào)用o()央碟,會在控制臺輸出不同的值。為什么呢均函?
因為inside函數(shù)創(chuàng)建的同時亿虽,生成了一個閉包,函數(shù)創(chuàng)建處的詞法環(huán)境被保存到了這個閉包中苞也。
當通過o調(diào)用這個inside函數(shù)時洛勉,函數(shù)內(nèi)的變量,是到創(chuàng)建時的詞法環(huán)境中去解析的如迟,而不是到當前的調(diào)用環(huán)境中解析收毫。因此,i會找到var i=0;處的i殷勘。又因為此再,詞法環(huán)境中保存的是i的引用,所以玲销,多次調(diào)用修改的是同一個i输拇,因此每次調(diào)用的控制臺顯示的結(jié)果不同。
我的理解是痒玩,閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)淳附,類似于java中的作用域。
由于在Javascript語言中蠢古,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量奴曙,因此可以把閉包簡單理解成"定義在一個函數(shù)內(nèi)部的函數(shù)"。
所以草讶,在本質(zhì)上洽糟,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。