首页 > 代码库 > JavaScript 闭包(随笔)

JavaScript 闭包(随笔)

闭包,伟大的闭包.... 先看看百科对百度的定义是什么样的。

百科说:闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。

看完整个人都不好了。  这都是什么鬼???

还是自己总结下:

什么样才能产生闭包?在javascript技术层面上来说父函数嵌套子函数的形式就可能会产生闭包函数。如这样的:

//闭包函数fn的创建
	function fn (){
	  var a = 2;
	  var b = 4;
	  function fn1(){
		console.log(a);
	  };
	  fn1();
     }
	fn();

  

  解析:fn1.[[scope]] --> fn.lexical environme || fn.[[scope]]      //

闭包的个人理解:

在创建fn1子函数的时候会给fn1加一个scope属性,而这个属性指向的是fn父函数的词法环境。如果fn函数还有父函数的话,fn的scope属性又指向该函数的父级函数的词法环境,如此就形成了一个作用域链。

所以闭包的本质是因为JS支持这种作用域链而且还支持函数嵌套函数才会导致有闭包的可能。嗯。。 就是这个原因!!!

 

1、在子函数内部不调用父函数的任何自由变量此时不会有闭包产生;
2、在子函数的子涵内部用父函数的父函数的任何自由变量此时会产生闭包;

如:

//第一种情况:不会产生闭包			
  function fn (){     var j = 4;     function fn1(){       console.log("子函数代码内部没调用符函数的任何东西,不会产生闭包;")     };     fn1();   };   fn();
//第二种情况:产生闭包   function fm(){     var k = 5;     function fm1(){       var y = 9;       function fm2(){         console.log(k) //此函数调用了父级的父级函数内部的变量则会有闭包产生; closure -> k:5       };       fm2();     };     fm1();
  };   fm();

  闭包的简单例子:

// 计算base 和 max 的和,但是max要从1一直加到max的值然后与base相加;(利用闭包的来做的话可以减少定义全局变量的数量)
function calfu (base){
  return function (max){
    var total = 0;
    for (var i =1; i <= max; i++) {
    total = total + i;
  }
    return total + base;
  };
};
var reult = calfu(2);
reult(3)  // 1+2+3+2 == 8
alert(reult(3));  //弹出结果为8

  最后来一句:

“由于闭包携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多,我们建议读者只在绝对必要时再考虑使用闭包。虽然像

V8等优化后的Javascript引擎会尝试回收被闭包占用的内存,但请大家还是要慎重使用闭包。”

嗯。  对。这是大神说的话。。慎重,慎重,再慎重....

JavaScript 闭包(随笔)