什么是閉包?
- 可以訪問函數(shù)內(nèi)部變量的函數(shù)
//首先我們要明白這段代碼
//外面的a是跟函數(shù)作用域里邊的a是不同的
//num(a)只是把外面的a的值賦值給函數(shù)里面的a
//函數(shù)里面聲明的東西跟外面的一點(diǎn)關(guān)系都沒有蹄溉。
var a=99
function num(a){
++a
console.log(a)
}
num(a)//100
console.log(a)//99
var arr=[];
for(var i=0;i<2;i++){
arr[i]=function(){
console.log(i)
}
}
arr[1]()//都是會(huì)打印出2
arr[0]()//2
//首先明白function()里面的東西是什么時(shí)候會(huì)執(zhí)行究恤。
//實(shí)在函數(shù)被調(diào)用的時(shí)候才會(huì)執(zhí)行崩侠,上面代碼在函數(shù)執(zhí)行的時(shí)候傀缩,已經(jīng)遍歷完畢那先,i==5,所以赡艰,每次打印的都是5
改裝下
var arr=[];
for(var i=0;i<2;i++){
function num(i){
arr[i]=function(){
console.log(i)
}
}
num(i)
}
arr[0]()//0
arr[1]()//1
上面的代碼可以拆分為
當(dāng)i=0的時(shí)候:
function num(i){
//i=0 寫在形參的I其實(shí)就是在函數(shù)內(nèi)部聲明了一個(gè)變量==var i
arr[0]=function(){
console.log(0) //我獲取的是函數(shù)里面的i
}
}
num(0)
//參考例子1售淡,我們是吧遍歷的i的值賦給了函數(shù)里面的i,
//那么我們外面的調(diào)用arr[0]()的時(shí)候瞄摊,
自然里面的就會(huì)按照函數(shù)的作用域勋又,
上去找i打印,
找到的是num函數(shù)里面的i换帜,
所以就打印出0;
如此類推
當(dāng)i=1時(shí):
function num(i){
//i=0 寫在形參的I其實(shí)就是在函數(shù)內(nèi)部聲明了一個(gè)變量==var i
arr[1]=function(){
console.log(1) //我獲取的是函數(shù)里面的i
}
}
num(1)
最后可以改為:
var arr=[];
for(var i=0;i<2;i++){
!function (i){
arr[i]=function(){
console.log(i)
}
}(i)
}
arr[0]()
arr[1]()
第二種方法
var arr=[];
for(var i=0;i<2;i++){
arr[i]=function(i){
return function (){
console.log(i)
}
}(i)
}
arr[0]()//0
arr[1]()//1
//拆一下 也可以寫為:
var arr=[];
for(var i=0;i<2;i++){
arr[i]=fn(i)
function fn(i){
return function (){
console.log(i)
}
}
}
arr[0]()//0
arr[1]()//1