㈠ js閉包函數
寫這個文章也是為了回顧下閉包的只是點,其實許多前端對閉包都有點一知半解,包括我自己也是。
閉包函數:聲明在一個函數中的函數,叫做閉包函數。
閉包:內部函數總是可以訪問其所在的外部函數中聲明的參數和變數,即使在其外部函數被返回(壽命終結)了之後。其實閉包在我看來就是變數作用域的。
let c = test()其實就是將test函數運行的結果賦值給c,其返回的是d方法
執行後的結果是30,因為正常來說a和b其實是局部變數,只作用於test函數。而c()的運行環境並沒有變數a和b,其實這就是b包。由於在javascript中,只有函數內部的子函數才能讀取局部變數,所以說,閉包可以簡單理解成「定義在一個函數內部的函數「。
所以,在本質上, 閉包是將函數內部和函數外部連接起來的橋梁 。
1、是前面提到的 可以讀取函數內部的變數
2、是 讓這些變數的值始終保持在內存中 ,不會在調用後被自動清除。
閉包的注意事項:
1、由於閉包會使得函數中的變數都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。 解決方法是,在退出函數之前,將不使用的局部變數全部刪除。
2、閉包會在父函數外部,改變父函數內部變數的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變數當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變數的值。
在網上看到了一道練習題,跟this指向也有關系,可以看下
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());