首頁 > web前端 > js教程 > JS與函數式語言的三特性_基礎知識

JS與函數式語言的三特性_基礎知識

WBOY
發布: 2016-05-16 16:56:55
原創
1098 人瀏覽過

首先要有一個概念:不是一個語言支援函數,這個語言就可以叫做「函數式語言」。函數式語言中的函數(function),除了能被呼叫之外,還具有一些其他性質。有以下三點:
1. 函數是運算元
2. 在函數內儲存資料
3. 函數內的運算對函數外無副作用
一、函數是運算元
普通的函數呼叫時,可以抽象的理解為:函數就是一個運算符,傳入的參數是運算元;
但當JavaScript中的函數作為另一個函數的參數使用時,是傳遞引用的,這個「傳入參數」就可以被理解為是一個運算元。由此的結論是,(作為「傳入參數」的)函數具有運算元的意義,「函數參數」與普通參數並沒有什麼不同。

二、在函數內保存資料
在命令式語言中,函數內部的私有變數(局部變數)是不能被保存的。從程式的執行方式上來講,局部變數在堆疊上分配,在函數執行結束後,所佔用的堆疊被釋放。因此函數內的資料不可能被保存。
在JavaScript的函數中,函數內的私有變數可以被修改,而且當再次「進入」到該函數內部時,這個被修改的狀態仍將持續。下面的範例說明了這個特性:

複製程式碼 程式碼如下:

  var set,get ;
  function MyFunc(){
      var value = 100;

      function set_value(v){
          value = v;
        return value;
      }

      set = set_value;

      get = get_value;

  } 
  MyFunc();
  } 
  MyFunc();
  } 
  MyFunc();
  console.log( >  console.log(get()); //300


顯而易見的一個好處是,如果一個資料能夠在函數內持續保存,那麼該函數(作為構造器)賦給實例時就可以使用這些資料進行運算;而在多個實例之間,由於資料存在於不同的閉包中,因此相互不會產生影響。
以物件導向的術語來解釋,就是說不同的實例有各自的私有資料(複製自某個公共的資料)。下面的例子說明了這個特性:
複製程式碼 程式碼如下:

  function MyObject() {
      var value = 100;
      this.setValue = function(){
       Value = function(){
          console.log(value );
      }
  }
  var obj1 = new MyObject();
  var obj2 = new MyObject();

  obj2.setValue(300);  obj1.showValue(); //100;


三、函數內的運算對函數外無副作用
這一特性的意義在於:
* 函數使用入口參數進行運算,而不修改它(作為值參數而不是變數參數使用)
* 在運算過程中不會修改函數外部的其他資料的值(例如全域變數)
* 運算結束後透過「函數返回」向外部系統傳值

這樣的函數在運算過程中對外部系統是無副作用的。然而我們注意到,JavaScript允許在函數內部引用和修改全域變量,甚至可以聲明全域變數。這一點其實是破壞它的函數式特性的。 除此之外,JavaScript也允許在函數內修改物件和陣列成員————這些成員應該由物件方法而非物件系統外的其他函數來修改。

所以:JavaScript這項特性只能透過開發人員的程式設計習慣來保證。

相關標籤:
js
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板