閉包,接觸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。