Javascript閉包函數快速上手

閉包函數是什麼?在開始學習的閉包的時候,你們很能都比較難理解.就從他的官方解釋來講,都是比較概念化的.c++


不過咱們也仍是從閉包的含義出發. web

閉包是指函數有自由獨立的變量。換句話說,定義在閉包中的函數能夠「記憶」它建立時候的環境。 編程

官方解釋說完後,咱們先來看一個簡單計數的例子. 微信

var c = 0;
function count(){
c++;
}
count();// 1
count();// 2


這個例子是利用了全局變量來實現,可是這裏有個問題是,c這個變量也容易被其餘方式所調用,這時候就可能會改變 c 的存儲值.形成這個count計數的失效.那怎麼很好的處理這個問題呢!咱們會想到的是使用局部變量的方式來處理.好比: 閉包

function count(){
  var c = 0;
  function add(){
    c++;
  }
  add();
}
count();// c = 1
count();// c = 1


由於這樣建立以後,內部變量只存在於count函數建立執行的時候,執行完以後,整個函數就會被丟棄掉.就沒法達到有記憶的能力.那要怎麼來實現呢?那咱們就用閉包來解決.我要從新提一次:閉包 = 函數 + 環境 函數

function count(){
   var c = 0;
   function add(){
      c++;
   }
   return add;
}
var ct = count();
ct(); // c = 1
ct(); // c = 2

這個時候咱們就能夠經過這個閉包來完成計數的能力.ct就是一個閉包函數,內部的環境就是這個局部變量 c. 這裏咱們達到的就是內部數據,外部來操做.那閉包除了這個還有什麼其餘功能呢?學習


用閉包模擬私有方法

這有點像JAVA的私有方法或者私有變量,只能容許本身來操做!若是外部操做,就須要設定公開的方法來操做. spa

var person = (function(){
    var _name = "編程的人";
    var age = 20;
    return {
     add:function(){
         age++;
     },
     jian:function(){
         age--;
     },
     getAge:function() {
         return age;
     },
     getName:function(){
         return _name;
     },
     setName: function (name) {
         _name = name;                
     }
    }
})();
person.add();
var age = person.getAge();
console.log(age)
person.setName("編程的人公衆號:bianchengderen")
console.log(person.getName())


這裏應該很容易理解了吧! 有點面向對象編程的感受.固然Javascript如今也有面向對象編程的特色.這點咱們之後來講明.
orm

目前爲止,咱們從計數到內部私有化的例子,來講明閉包,但願你們能簡單明白其中的道理,固然閉包還有其餘的功能利用,是比較方便的. 對象


本文屬於吳統威的博客,微信公衆號:bianchengderen 的原創文章,轉載時請註明出處及相應連接:http://www.wutongwei.com/front/infor_showone.tweb?id=157 ,歡迎你們傳播與分享.

相關文章
相關標籤/搜索