關於js的閉包和匿名函數
阿新 • • 發佈:2019-03-07
執行 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的閉包和匿名函數