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
相關文章
相關標籤/搜索