1. 程式人生 > >關於js的閉包和匿名函數

關於js的閉包和匿名函數

執行 clas 為什麽 obj log 返回 內部 聲明 案例

關於js閉包。之前我一直以為是匿名函數,以為封閉式的創建即執行銷毀就是閉包,其實這是匿名函數,不一樣的。也沒有閉包的使用經驗。

後來去網上查了下才知道,閉包的意思是:函數內部還有函數,返回一個函數,內部函數可訪問外部函數的變量

一個最簡單的案例:

a是外部函數,b是內部函數,b可以使用a的變量i,調用a函數返回b函數,執行c既是執行b。其實也就意味著在a函數的外部,讀取到了a函數內部的變量值。

a中的變量i將一直在內存中,直至c變量回收。

{
	let a=function(){
		let i=1;
		let b=function(){
			console.log(i+1)
		}
		return b;
	}
	let c=a();
	c();//2
}

obj.geta()輸出2,this代表當前對象。而閉包(內部函數)中的this代表window,這裏為什麽不輸出1呢?因為這個a是let聲明賦值的,不會傳給window。

return function是直接返回一個匿名函數

{
	let a=1;
	let obj={
		a:2,
		geta:function(){
			console.log(this.a)
			return function(){
				console.log(this.a)
			}
		}
	}
	let c=obj.geta();//2
	c();//undefined
}

用這種方式就可以了,外部將this賦值給一個新變量,再給閉包

{
	let a=1;
	let obj={
		a:2,
		geta:function(){
			let _this=this;//將this賦值給_this再給閉包
			console.log(this.a)
			return function(){
				console.log(_this.a)
			}
		}
	}
	let c=obj.geta();//2
	c();//2
}

關於js的閉包和匿名函數