一直看到這個英文縮寫,可是不知道它具體是啥東西,google幾回都講的非程序層面的意思,找到一篇還不錯的介紹文章,轉載過來...javascript
出自:http://mzhou.me/?p=95219html
什麼是DSL?前端
DSL即領域編程語言,它是用於解決特定領域問題的語言。與GPPL(通用目的編程語言)相比,DSL針對的目標是特定的領域。其實DSL並非什麼高深的東西,SQL、正則表達式、CSS等等都是一種DSL。對於前端工程師來講jQuery就是一種DSL。java
DSL能夠分爲兩種:內部DSL、外部DSL。外部DSL是自我包含的語言,它們有本身特定語法、解析器和詞法分析器等等,它每每是一種小型的編程語言,甚至不會像GPPL那樣須要源文件。與之相對的則是內部DSL。內部DSL其實更像是種別稱,它表明一類特別API及使用模式[1]。jQuery就是一種內部DSL,而CSS則是一種外部DSL。正則表達式
$(".selector").text("display text") .append("<div>children</div>") .show();
使用DSL的好處就是:咱們能夠更關注作什麼(What)而不是怎麼作(How)! jQuery是一門用於解決多種瀏覽器上javascript 執行兼容性的DSL,它提供了一組API用於Web前端開發的通用功能:DOM、AJAX、Event等等。衆所周知,瀏覽器的兼容性是前端開發中最難解決的問題,而使用jQuery能夠避免多數bad parts,只使用Good parts。這樣咱們在開發時就能夠更關注作什麼(What),而不用管底層的瀏覽器js是怎麼作(how)的。編程
函數式編程數組
編程語言的進化史是這樣的:瀏覽器
打孔機,機器語言(記得操做系統課上老師展現過…) 彙編語言:最底層的操做都經過代碼來指定 面向過程語言:Picasal、C 面嚮對象語言:C++ 虛擬機時代(垃圾收集、類型安全):Java、C# 動態語言:Python、Ruby 扯的有點遠了,我想說的是:編程語言愈來愈抽象了…安全
在數學中函數的抽象定義是元素(輸入)與元素(輸出)之間的對應數學關係。例如:y=f(x)定義了x與y之間的數學關係,函數計算完成以後x的值不會改變,並返回一個輸出y。前端工程師
在編程語言中爲了重複利用一些特定操做,因而產生了函數。函數被定義爲:根據輸入計算獲得輸出的一批程序指令。函數計算完成以後輸入可能會改變,並返回一個輸出或不返回。
編程語言中的函數與數學函數最大的區別在於:函數是有狀態的,它能夠修改外部變量或輸入變量。而數學函數沒有狀態、沒有變量。而且程序語言的函數除了計算值以外還能夠作些額外的操做。這些操做能夠是:打印日誌、調整顯示GUI等等。
函數式編程的定義是:將計算等同於數學函數的編程範式。「函數式編程」中的函數是數學函數而不是通常程序語言中的函數。
函數式編程與通常的命令式編程的區別:
//命令式編程: function Counter(_i) { var i = _i || 0; this.add = function(j) { i = i+j; } } //函數式編程: function Counter(_i) { var i = _i || 0; this.add = function(j) { return new Counter(i+j); } }
二者的區別在於函數式編程的add方法並無修改i變量,也就是Counter沒有可變的狀態。這賦予了函數式編程最大的優勢:線程安全。雖然前端的javascript開發並無涉及到多線程的狀況,不過隨着HTML5的普及,WebWorker的出現也會使的javascript漸漸出現多線程並行問題。
固然函數式編程的優勢並不僅在於線程安全這一個,並且更在於它在某些狀況下的結構清晰,例如:修改給全部數組中的值加1。
//命令式編程: function add(array) { for (var i=0,length=array.length;i<length;i++) array[i]++; } //函數式編程: function add(n) { return n+1; } //不修改輸入變量 _(array).map(add);
兩端段代碼,相比之下後者的結構更加清晰,由於它相比命令式編程更進一步抽象了。函數式編程達到了和DSL同樣的目的:咱們能夠更關注作什麼(what)而不是怎麼作(how),提供更清晰的代碼結構。除了例子中map以外,還有延遲計算、Memorization等等這些都是函數式編程中的Good parts。
以前那段代碼中用到了一個javascript庫就是understandcore.js,這個庫提供了在js中實現函數式編程的功能。固然作到徹底的使用函數式編程是不可能的!
由於咱們總會遇到須要在函數中作其餘操做的狀況,例如打印日誌; 還有性能問題,第一個例子中函數式編程明顯在性能上有很大劣勢; 因此「函數式編程」也須要在適當的時候使用才能發揮做用,不能濫用!
參考: