1、定義和用法: 當一個函數的返回值是另外一個函數,而返回的那個函數如果調用了其父函數內部的其它變數,如果返回的這個函數在外部被執行,就產生了閉包。 2、表現形式: 使函數外部能夠調用函數內部定義的變數。 3、實例如下: (1)、根據作用域鏈的規則,底層作用域沒有聲明的變數,會向上一級找,找到就返回 ...
1、定義和用法:
當一個函數的返回值是另外一個函數,而返回的那個函數如果調用了其父函數內部的其它變數,如果返回的這個函數在外部被執行,就產生了閉包。
2、表現形式:
使函數外部能夠調用函數內部定義的變數。
3、實例如下:
(1)、根據作用域鏈的規則,底層作用域沒有聲明的變數,會向上一級找,找到就返回,沒找到就一直找,直到window的變數,沒有就返回undefined。這裡明顯count 是函數內部的flag2 的那個count 。
var count=10; //全局作用域 標記為flag1 function add(){ var count=0; //函數全局作用域 標記為flag2 return function(){ count+=1; //函數的內部作用域 alert(count); } } var s = add() s();//輸出1 s();//輸出2
4、變數的作用域
要理解閉包,首先必須理解Javascript特殊的變數作用域。
變數的作用域分類:全局變數和局部變數。
特點:
1、函數內部可以讀取函數外部的全局變數;在函數外部無法讀取函數內的局部變數。
2、函數內部聲明變數的時候,一定要使用var命令。如果不用的話,你實際上聲明瞭一個全局變數!
5、使用閉包的註意點
1)濫用閉包,會造成記憶體泄漏:由於閉包會使得函數中的變數都被保存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致記憶體泄露。解決方法是,在退出函數之前,將不使用的局部變數全部刪除。
2)會改變父函數內部變數的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變數當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變數的值。
感謝閱讀上海前端培訓文章,感謝關註!更多內容請點擊 上海前端培訓