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

 

 
posted @ 2018-05-04 18:43  小白~-  阅读(1885)  评论(0编辑  收藏  举报