1. 程式人生 > 其它 >js高階_常見閉包

js高階_常見閉包

將函式作為另一個函式的返回值

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);