欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS和函數(shù)式語言的三特性

 更新時間:2014年03月05日 14:51:08   作者:  
本文內(nèi)容是我閱讀《JavaScript語言精髓與編程實踐》時,做的讀書筆記,周愛民老師的書寫的太深刻了

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

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

復制代碼 代碼如下:

  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


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

  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;


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

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

相關(guān)文章

最新評論