国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS和函數式語言的三特性

2024-05-06 16:02:14
字體:
來源:轉載
供稿:網友
本文內容是我閱讀《JavaScript語言精髓與編程實踐》時,做的讀書筆記,周愛民老師的書寫的太深刻了

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

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

復制代碼 代碼如下:


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

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

      set = set_value;
      get = get_value;
  } 
  MyFunc();
  console.log(get()); //100
  set(300);
  console.log(get()); //300


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

復制代碼 代碼如下:


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

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


三、函數內的運算對函數外無副作用
這一特性的含義在于:
* 函數使用入口參數進行運算,而不修改它(作為值參數而不是變量參數使用)
* 在運算過程中不會修改函數外部的其他數據的值(例如全局變量)
* 運算結束后通過“函數返回”向外部系統傳值

這樣的函數在運算過程中對外部系統是無副作用的。然而我們注意到,JavaScript允許在函數內部引用和修改全局變量,甚至可以聲明全局變量。這一點其實是破壞它的函數式特性的。
除此之外,JavaScript也允許在函數內修改對象和數組成員————這些成員應該由對象方法而非對象系統外的其他函數來修改。
所以:JavaScript這項特性只能通過開發人員的編程習慣來保證。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 永吉县| 雷州市| 普兰店市| 平邑县| 万宁市| 三亚市| 军事| 廉江市| 广德县| 宕昌县| 溧阳市| 太康县| 马公市| 壶关县| 台安县| 玉林市| 德格县| 永福县| 金塔县| 德保县| 宕昌县| 东乌珠穆沁旗| 襄垣县| 石楼县| 江西省| 乐至县| 启东市| 天镇县| 林西县| 庆阳市| 大足县| 攀枝花市| 邹城市| 义乌市| 三台县| 徐闻县| 永德县| 东光县| 洛浦县| 攀枝花市| 封丘县|