关于闭包的理解

发表一下关于闭包的理解:
首先把每一个函数看成一个一个的“小黑屋”小黑屋里面可以看到外面的东西,但外面却看不到小黑屋里面的东西,就好比是函数可以访问外面全局变量,但是外面却访问不了“小黑屋”里面的变量;变量分为全局变量和局部变量;
列:函数可以访问外面全局变量
  var a=1;
  function fun1(){
    alert(a);
  }
fun1(); // 1

列:外面却访问不了“小黑屋”里面的变量
  function fun2(){
    var a=2;
  }
  alert(a); // a is not defined
但是如果想取到“小黑屋”内部的变量怎么办呢?自然一种叫闭包的东西出来了。
闭包就是可以访问函数内部变量的函数;
闭包就是函数内部嵌套函数,里层函数就叫闭包;
再说一下链式作用域:子函数中可以访问父函数的所有变量。当然也包括全局变量window(一般的函数定义function a(){},其实都是window对象的子函数)
开始举例:因为有链式作用域fun2可以获取到fun1的变量a,所以把fun2当做fun1的返回值不就相当于在最外面可以获取到fun1内部的东西了吗,(记住你的初衷是想获取fun1”小黑屋”内部的东西才引入的fun2)
  function fun1(){
    a=1;
    return function fun2(){
       alert(a);
     }
}
alert(fun1())

Alert出了fun1的返回值是一个函数再次执行返回的函数即fun1()()
Alert(fun1()())

你最初的想法是想获取小黑屋里面的a但一般是不可以的,用了闭包发现可以了,这就是闭包的作用。闭包还有一个作用因为他可以把函数内部的东西变为全局的东西,不让垃圾回收机制回收a一直在内存中存在,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题;
测试一下自己吧:
var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        return function(){
         return this.name;
      };
     }
};
alert(object.getNameFunc()());
知道输出结果吗?不知道的跟我一步一步来分析吧,首先是定义了一个叫name的字符串,和定义了一个object对象,对象里面有两个属性name和getNameFunc,而getNameFunc后面就是咱们之前说的闭包(内外层函数嵌套),这可以看明白吧,object.getNameFunc()()的意思就是上面例子的fun1()(),至于内层函数的this是指向window的即window.name即正确答案是"The Window"; 如果你答案是"My Object"那应该题目是this.object.name,
参考借鉴:http://www.jb51.net/article/24101.htm

posted @ 2016-11-04 21:45  奔跑的小七  阅读(187)  评论(0编辑  收藏  举报