javascript中闭包(Closure)详解
作者:bea
在javascript中,函数可看作是一种数据,可以赋值给变量,可以嵌套在另一个函数中。 var fun = function(){ console.log("平底斜");} function fun(){ var n=10; function son(){ n++; } son(); console.log(n);}fun(); //11fun(); //11 我们把上面第二段代码稍微修改下: var n=10;function fu
在javascript中,函数可看作是一种数据,可以赋值给变量,可以嵌套在另一个函数中。
var fun = function(){
console.log("平底斜");
}
function fun(){
var n=10;
function son(){
n++;
}
son();
console.log(n);
}
fun(); //11
fun(); //11
我们把上面第二段代码稍微修改下:
var n=10;
function fun(){
function son(){
n++;
}
son();
console.log(n);
}
fun(); //11
fun(); //12
看出差别了吗,如果理解不了代码执行结果,请看上一篇博文,关于javascript作用域和作用域链的讲解。
上面这段代码中变量n是全局变量,随时可能被重新赋值,而无需通过fun函数的调用。为了让变量n不受污染,或者说是减少全局变量的污染,我们需要把n放到函数中作为局部变量。
function fun(){
var n=10;
function son(){
n++;
console.log(n);
}
son();
}
fun(); //11
fun(); //11
如果我们可以在全局中直接调用son函数,那么便可以达成想要的效果。son函数现在是作为局部变量存在,要想在全局中访问,一般有两种方法:
一种是赋值给全局变量
var a;
function fun(){
var n=10;
a = function son(){
n++;
console.log(n);
}
}
fun(); //son()
a(); //11
a(); //12
另一种是使用return返回值
function fun(){
var n=10;
return function son(){
n++;
console.log(n);
}
}
var a=fun();
a(); //11
a(); //12
上面的son()函数就是闭包,某种意义上所有函数都可以看作闭包。闭包就是可以访问外层函数作用域的变量的函数。
var a;
function fun(){
var n=10;
a = function son(){
n++;
console.log(n);
}
return a();
}
fun(); //11
a(); //12
a(); //13
fun(); //11
a(); //12
a(); //13
还是上面那段代码,我们稍微修改下,再看看执行结果,这是因为每次执行fun()函数时都会初始化变量n。
闭包的好处是减少全局变量,避免全局污染,可以将局部变量保存在内存中。但这既是优点又是缺点,一段代码中如果闭包过多,有可能造成内存泄露。由于闭包中局部变量不会被垃圾回收机制回收,所以需要手动赋值为null(关于内存泄露,后期单独开专题)
猜你喜欢
您可能感兴趣的文章:
- JavaScript动态创建div等元素实例讲解
- 谈谈JavaScript类型系统之Math
- 莱鸟介绍javascript onclick事件
- 莱鸟介绍window.print()方法
- JavaScript实现点击按钮直接打印
- javascript中加var和不加var的区别 你真的懂吗
- JavaScript引用类型和基本类型详解
- js模仿java的Map集合详解
- JavaScript中iframe实现局部刷新的几种方法汇总
- JavaScript iframe数据共享接口实现方法
- js实现仿qq消息的弹出窗效果
- 2016年最热门的15 款代码语法高亮工具,美化你的代码
- 详解jQuery Mobile自定义标签
- 谷歌Chrome浏览器扩展程序开发小记
- JavaScript类型系统之基本数据类型与包装类型
- 4种JavaScript实现简单tab选项卡切换的方法
- js针对ip地址、子网掩码、网关的逻辑性判断
- js判断当前页面在移动设备还是在PC端中打开
- js判断当前页面用什么浏览器打开的方法