初识js中的闭包

网上有许多关于闭包的概念,但大多都十分抽象,难以理解。下面是我个人对闭包的一些简单理解,如有不正确的地方请各位大牛指点。

闭包是定义在一个函数中的函数。在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(); //局部变量

查看运行结果

闭包就充当了方法内部和外部之间的一个桥梁,将方法内部的局部变量暴露给外界。

使用闭包时,局部变量的值会保存在内存中,因此上例中运行结果为"局部变量",而不是"全局变量"。但如果滥用闭包,就会严重影响网页性能,因此在退出方法之前要将不使用的局部变量清空。