JavaScript闭包

110 阅读2分钟

JavaScript闭包

为什么使用闭包?

  1. 从外部读取函数内部变量。
  2. 让变量的值始终保持在内存中。
function f1(){
    var a = 99; // 局部变量
    function f2(){
       alert(a); // 99 对于函数f2来说 父对象f1中定义的变量都是可见的
    }
    return f2;
}
var result = f1();
result(); // 99

由于f1中的局部变量对于f2是可见的,所以将f2作为返回值返回,在f1外部就能读取到f1内部的变量,此时,函数f2就是闭包。

闭包就是能够读取其他函数内部变量的函数。由于在JavaScript语言中,只有函数内部的子函数才能读取局部变量,所以闭包可以简单的理解为一个定义在函数内部的函数

一个疑问:在函数外部是否可以调用函数内部定义的函数?

在函数外部不能直接调用函数内部定义的函数,若要调用函数内部定义的函数,需要在函数外部先声明一个变量(全局变量),用变量来接收函数内部定义的函数的函数名,之后先调用外部函数,再调用内部函数即可。

var test; // 全局变量
function outFunc(){
	var a = '我是局部变量';
	function inFunc(){
		alert(a)
	}
	test = inFunc // 用全局变量接收内部函数的函数名
}
// 先调用外部函数
outFunc();
// 再调用内部函数
test();

使用闭包需要注意:

  1. 由于闭包会使得函数中的变量一直存在内存中,对内存消耗很大,所以不能滥用闭包,否则会造成网页性能问题,在IE中可能内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  2. 闭包会在父函数外部,改变父函数内部的值。