Js 闭包

谈谈 ,闭包 , 做用域
闭包是Javascript语言的一个难点,也是它的特点,不少高级应用都要依靠闭包实现。
 
谈到闭包,咱们先谈谈做用域
在 js 中做用域无外乎两种:
1,全局做用域;在JavaScript中全局变量的做用域比较简单,它的做用域是全局的,在代码的任何地方都是有定义的。
2,局部做用域;也能够理解为函数做用域;JavaScript的函数做用域是指在函数内声明的全部变量在函数体内始终是可见的;而对函数体外不可见。另外局部变量的优先级要高于同名的全局变量,也就是说当局部变量与全局变量重名时,局部变量会覆盖全局变量。
 
上边咱们说了做用域,那么实际开发中,出于种种缘由,咱们有时候须要获得函数内的局部变量;理论上函数体内部的变量,在函数外是没有办法访问到的,怎么解决呢 ? 那就是在函数的内部,再定义一个函数 => 闭包
 
什么是闭包 ?
“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(一般是一个函数),于是这些变量也是该表达式的一部分;
通俗的讲:就是函数a的内部函数b,被函数a外部的一个变量引用的时候,就建立了一个闭包.
个人理解: 闭包就是可以读取其余函数内部变量的函数。
在Javascript语言中,只有函数内部的子函数才能读取局部变量,所以能够把闭包简单理解成"定义在一个函数内部的函数"。
因此,在本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁。
 
闭包的用途
1,在外部读取函数内部的变量
2,让这些变量始终保存在内存中(变相的储存)
咱们来实现一个闭包的例子 :
 function f1(){
    var n=999;
    function f2(){
      alert(n); 
    }
    return f2;
  }
  var result=f1();
  result(); // 999
闭包的优缺点
优势就不用多说了,能够访问函数内部的变量,而且不受污染,始终保存在内存中
缺点就是闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成页面的性能问题,在IE中可能致使内存泄露。解决方法是,在退出函数以前,将不使用的局部变量所有清除
 
最后来砍一刀, 阮一峰老师的思考题,你们答对了嘛 ? 
 var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

  alert(object.getNameFunc()());  // My Object