Closure 閉包

閉包,接觸js的確定不會陌生,學習的一番,有以下理解:java

一 .怎樣理解ruby

百科上的解釋是,閉包指的是能夠訪問自由變量的代碼塊,這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量);閉包

我是這麼理解的,一段代碼塊的運行,看得見的是代碼,是敲出的字符,看不見的是運行時的環境和上下文,運行時的環境本質也是一組變量,代碼塊運行的時候,能夠調用自身定義的局部變量,還能夠根據定義時得綁定訪問外部定義的數據,就是閉包。不嚴謹的歸納一下,只要訪問了外部定義的數據的代碼塊,就是閉包!dom

二.代碼舉例函數

function fA(x){學習

  var temp = 2;設計

  return function(y){對象

    alert(y+x+temp);get

  }  io

}

var fB = fA(3);

fB(4); --這就是一個閉包 ,它訪問了temp,x這些不是自身定義的變量或參數,這些基本類型數據之間都是值傳遞

var arg = new Number(2);

var fB = fA(arg);

fB(4);--當傳遞的變量或參數是Object,數據傳遞則是引用傳遞,對arg的任何操做都是指向最初一個對象

js中調用延遲函數,其實不知不覺中也是在使用閉包特性,

function replace(domId,text,time){

  setTimeout(function(){

     document.getElementById(domId).innerHTML = text; 

  },time)

}

三.還用什麼用

  上面舉例幾種閉包在js中的例子,代表其實咱們在不瞭解閉包的狀況下,也常常使用閉包特性,接下來舉一個不經常使用的例子,隱藏函數的中數據,這個搞過java的人都知道get/set這種pojo中的寫法,類的屬性對外隱藏,提供統一的對外訪問修改的方法,用閉包也能夠實現

var pojo = (function {

  var arr = {};

  return function (key,val){

    if(val=== undefined) return arr[val];

    else{

      date[key] = val;

      return date[key];

    }

  } 

}){};

pojo('a');//undefined

pojo('a',1);//set 1

pojo('a');//get 1

 

四.一些思考

  目前,不光js,在java7,C#,ruby中都加入了閉包的特性,C#中閉包經過委託來實現大寫基礎,隨後發展出簡潔優雅的lambda表達式和LINQ,是的用C#寫代碼莫名的感受爽,無論存在於哪,閉包經過突破通常函數的調用限制,讓咱們在不知不覺中寫出更優雅的代碼。以前在一位博主上看到,一段這樣歸納閉包的話,深覺得然,其實不光是閉包,一些能普遍被接收語言特性,都是和閉包同樣有相似特色:

(1)閉包是一種設計原則,它經過分析上下文,來簡化用戶的調用,讓用戶在不知曉的狀況下,達到他的目的;

(2)網上主流的對閉包剖析的文章其實是和閉包原則反向而馳的,若是須要知道閉包細節才能用好的話,這個閉包是設計失敗的;

(3)儘可能少學習。

over。

相關文章
相關標籤/搜索