网上有许多关于闭包的概念,但大多都十分抽象,难以理解。下面是我个人对闭包的一些简单理解,如有不正确的地方请各位大牛指点。
闭包是定义在一个函数中的函数。在javascript中,从方法外部无法获取方法内的局部变量(如果在方法内部声明变量不加var关键字,则为全局变量)。
function foo(){ var str = "hello world"; } //Uncaught ReferenceError: str is not defined alert(str);
但是有时我们需要从方法外部获取局部变量,这时就需要用到闭包。可能举例不太恰当,这类似于C#中,从类的外部要获取一个局部的私有字段,需要用到属性一样。
var str = "全局变量"; function foo(){ var str = "局部变量"; return function(){ alert(str); } } var result = foo(); result(); //局部变量
闭包就充当了方法内部和外部之间的一个桥梁,将方法内部的局部变量暴露给外界。
使用闭包时,局部变量的值会保存在内存中,因此上例中运行结果为"局部变量",而不是"全局变量"。但如果滥用闭包,就会严重影响网页性能,因此在退出方法之前要将不使用的局部变量清空。