含义:闭包是一个概念,它描述了函数执行完毕内存释放后,依然内存驻留的一个现象,只要把握这个核心概念,闭包就不难理解了

function a(){
  
   var i=0;
  
  function b(){
  
     alert(++i); 
  
    }
  
   return b;
  
 }
  
 var c = a();
  
 c();

即,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。

由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。

闭包的概念:函数对象可以通过作用域链相互关联起来,函数体内的变量可以保存在函数作用域内,这种特性被称为闭包。

var scope='global scope';

function checkscope(){

   var scope="local scope";

  function f(){  return scope;  }

  return f;

}

checkscope()();  

我们知道调用函数checkscope(),我们得到的不再是一个scope值,而是一个函数f;再接着调用函数f(),这里就出现了一个问题,调用函数f是在全局环境中调用,其中的scope值从何而来?上面提到过一个概念:js是采用的词法作用域,该scope值还是来自于该函数即f定义时的作用域,而不是调用时的作用域。所以结果还是local scope。

在犀牛书上还遇见一个例子比较经典。见代码:

function constfuncs(){
  var funcs=[];
  for(var i=0;i<10;i++){
    funcs[i]=function{   return i ;  }
  }
  return funcs;
}
var funcs=constfuncs();
funcs[5]()

此时,结果的返回值是10;

结合上面的概念一步一步分析:

首先,constfuncs()函数执行以后得到的是funcs数组,数组中是十个未执行的函数function(){return i}。当调用funcs[5]()的时候,变量i的值应该是函数在定义的时候i的取值,又因为直到i=10的时候循环才停止,所以,最后i的取值是10.函数调用返回值也是10。

从这里不能看出:关联到闭包的作用域链是“活动的”。嵌套函数不会将作用域内的私有成员复制一份,也不会对所绑定的变量生成静态快照。

05-11 13:24