Normally, when the function terminates, the scope is released because it's no longer necessary. However, in the case of an inner function that's returned to the outer application and assigned to an external variable, the scope of the inner function is attached to the outer function, which in turn is attached to the calling application—just enough to maintain the integrity of the inner function and the outer function argument and variable. Returning a function literal created as an internal object within another function, and assigning it to a variable in the calling application, is known as closure in JavaScript. This concept of scope chaining ensures that the data necessary for the application to work is in place.

通常,当函数结束时其作用范围也就会释放,因为已经不再需要了。但是,当一个内部函数向一个外部应用程序返回一个值,并赋给一个外部变量时,内部函数的作用范围就将附加到外部函数上,然后在附加到调用它们的应用程序中,这样才能保证内部函数和外部函数和变量的完整性。返回一个在其他函数中以内部对象形式创建的函数字面量,然后将其赋值给调用它的应用程序中的一个变量,这就是JavaScript中的闭包。它将引入一个作用范围链的概念,它是确保应用程序在此时能够正常工作所需要的数据。

以上内容摘自Learning JavaScript,太难理解了。下面是对“闭包”通俗点的定义。

概念

1. 闭包就是能够读取其他函数内部变量的函数。本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

2. 当内部函数在定义它的作用域的外部引用时,就创建了该内部函数的闭包,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们。

闭包的用途

最大用处有两个,一是读取函数内部的变量,二是让这些变量的值始终保持在内存中。

注意:

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

2.闭包会在父函数外部改变父函数内部变量的值。所以,如果你把父函数当作对象(Object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(Private value),这时一定要小心,不要随便改变父函数内部变量的值。

例1:

  1. <script type="text/javascript"
  2. function outerFunc(base){ 
  3.     var punc = "!"
  4.  
  5.     //返回内部函数 
  6.     return function(ext){ 
  7.         return base + ext + punc; 
  8.     } 
  9. function processNested(){ 
  10.     //创建对内部函数的访问 
  11.     var baseString = outerFunc("Hello "); 
  12.  
  13.     document.writeln(baseString+"<br />"); 
  14.     document.writeln(baseString()+"<br />"); 
  15.  
  16.     //内部函数仍然将访问外部函数的参数 
  17.     var newString = baseString("World"); 
  18.     document.writeln("newString= "+newString+"<br />"); 
  19.  
  20.     //再次调用 
  21.     var notherString = baseString("Reader"); 
  22.     document.writeln("notherString= "+notherString+"<br />"); 
  23.  
  24.     //创建另一个内部函数实例 
  25.     var anotherBase = outerFunc("Hiya, Hey "); 
  26.  
  27.     //另一个本地字符串 
  28.     var lastString = anotherBase("you"); 
  29.     document.writeln("lastString= "+lastString); 
  30. window.onload = processNested; 
  31. </script> 

 显示为:

JavaScript闭包_JavaScript闭包

 解释: 

baseString、notherString为外部函数outerFunc()的内部函数的一个引用, 

“Hello”、“Hiya,Hey”传递给外部函数的参数base, 

“word”、“you”传递给内部函数的参数ext 

例2:

  1. function outerFun() 
  2. var a=0; 
  3. function innerFun() 
  4. a++; 
  5. alert(a); 
  6. return innerFun; //注意这里 
  7. var obj=outerFun(); 
  8. obj(); //结果为1 
  9. obj(); //结果为2 
  10. var obj2=outerFun(); 
  11. obj2(); //结果为1 
  12. obj2(); //结果为2 

本文首发地址:http://www.boyige.tk/blog/?p=366

参考:http://www.jb51.net/article/24101.htm