閉包的定義
閉包就是能夠讀取其他函數內部變量的函數
什么時候使用閉包
閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。
先看看一般的調用方法:
1 var flag = "window"; 2 var object = { 3 flag : "local", 4 sayFlag: function(){ 5 alert(this.flag); 6 } 7 } 8 object.sayFlag();//local
然后改用閉包:
1 var flag = "window"; 2 var object = { 3 flag : "local", 4 sayFlag: function(){ 5 //返回一個匿名函數 6 return function(){ 7 alert(this.flag); 8 } 9 } 10 } 11 object.sayFlag()();//window
這里給大家普及一下this的相關問題
- 在全局函數中this等於window
- 當函數被當做某個對象的方法調用時,this等於那個對象
- 匿名函數的執行環境具有全局性,this通常指向window
那么如何訪問“local呢”?
1 var flag = "window"; 2 var object = { 3 flag : "local", 4 sayFlag: function(){ 5 var that = this; //此處的this是object的引用 6 //返回一個匿名函數 7 return function(){ 8 alert(that.flag); 9 } 10 } 11 } 12 object.sayFlag()();//local
閉包變量常駐內存
1 var say = function(){ 2 var i = 1; 3 var sayName = function(){ 4 i++; 5 alert(i); 6 } 7 return sayName; 8 } 9 var result1 = say(); 10 result1(); //1 11 result1(); //2
由於閉包訪問外部函數的i,外部函數返回引用閉包函數,所以內存不會被回收,i值也常駐內存,所以每次執行say函數時,i並不會重新復制