js高階_常見閉包
阿新 • • 發佈:2022-03-14
將函式作為另一個函式的返回值
function fn1(){
var a=2;
function fn2(){//執行函式定義就會產生閉包,執行函式定義不是指呼叫函式。
a++;
console.log(a);
}
return fn2;
}
var f=fn1();
f();//3
f();//4
它是調的fn1,但是fn1它的返回的是fn2,所以它這個f裡面實際上是儲存的是fn2的函式的引用。相當於f是fn2函式的例項。所以這個fn2函式的上下文物件裡面的a是等於2的,每呼叫一次它就加一次,只有重新呼叫外部函式fn1的時候才會重新產生一個閉包,重新產生一個fn2的函式上下文物件,裡面的a才會重置。但是這兩個呼叫fn1方法所接收的fn2是兩個獨立的閉包。
上面只產生了1個閉包。
怎麼看閉包產生了幾個?看外部函式被執行了幾次。
閉包什麼時候產生?
外部函式物件被呼叫時候產生。
閉包產生之後,外部函式執行完了,被引用的物件不會消亡,因為它賦值給了一個變數,相當於閉包這個空間的引用也給了這個變量了。,如果沒有閉包,就訪問不了裡面的a了。
將函式作為實參傳遞給另一個函式呼叫。
function showDelay(msg,time){
setTimeout(function(){
console.log(msg);
},time)
}
showDelay("hello",2000);