javascript常见闭包面试题
闭包的定义
闭包就是能够读取其他函数内部变量的函数
什么时候使用闭包
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
先看看一般的调用方法:
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并不会重新复制