国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript和函數式語言的三特性

BlackHole1 / 626人閱讀

摘要:在函數內保存數據在命令式語言中,函數內部的私有變量局部變量是不能被保存的。從程序的執行方式上來講,局部變量在棧上分配,在函數執行結束后,所占用的棧被釋放。這一點其實是破壞它的函數式特性的。

本文內容是我閱讀《JavaScript語言精髓與編程實踐》時,做的讀書筆記,周愛民老師的書寫的太深刻了!

函數式語言中的函數

首先要有一個概念:并不是一個語言支持函數,這個語言就可以叫做“函數式語言”。函數式語言中的函數(function),除了能被調用之外,還具有一些其他性質。有以下三點:

函數是運算元

在函數內保存數據

函數內的運算對函數外無副作用

函數是運算元

普通的函數調用時,可以抽象的理解為:函數就是一個運算符,傳入的參數是運算元;
但當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這項特性只能通過開發人員的編程習慣來保證。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78028.html

相關文章

  • JavaScript 闖關記》之簡介

    摘要:瀏覽器只是實現的宿主環境之一,其他宿主環境包括和。年月,版發布,成為國際標準。事件定義了事件和事件處理的接口。對于已經正式納入標準的來說,盡管各瀏覽器都實現了某些眾所周知的共同特性,但其他特性還是會因瀏覽器而異。 JavaScript 是面向 Web 的編程語言,絕大多數現代網站都使用了 JavaScript,并且所有的現代 Web 瀏覽器(電腦,手機,平板)均包含了 JavaScri...

    baihe 評論0 收藏0
  • 前端每周清單第 10 期:Firefox53、React VR發布、Microsoft Edge現代

    摘要:新聞熱點國內國外,前端最新動態發布近日,正式發布新版本中提供了一系列的特性與問題修復。而近日正式發布,其能夠幫助開發者快速構建應用。 前端每周清單第 10 期:Firefox53、React VR發布、JS測試技術概述、Microsoft Edge現代DOM樹構建及性能之道 為InfoQ中文站特供稿件,首發地址為這里;如需轉載,請與InfoQ中文站聯系。從屬于筆者的 Web 前端入門...

    MingjunYang 評論0 收藏0
  • JavaScript語言特性以及重要版本

    摘要:通常一個完成的不僅僅包含了還包括了以及相關版本該版本在中使用。基于原型函數先行的語言使用基于原型的的繼承機制,函數是的第一等公民其他相關的語言特性編譯型語言把做好的源程序全部編譯成二進制代碼的可運行程序。 轉載請注明出處,創作不易,更多文章請戳 https://github.com/ZhengMaste... 前言:JavaScript誕生于1995年,它是一門腳本語言,起初的目...

    Yangder 評論0 收藏0
  • SegmentFault 技術周刊 Vol.16 - 淺入淺出 JavaScript 函數編程

    摘要:函數式編程,一看這個詞,簡直就是學院派的典范。所以這期周刊,我們就重點引入的函數式編程,淺入淺出,一窺函數式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數式編程就是關于如使用通用的可復用函數進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數式編程(Functional Programming),一...

    csRyan 評論0 收藏0
  • 面向對象的 JavaScript

    摘要:是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。而在基于原型的面向對象方式中,對象則是依靠構造器利用原型構造出來的。 JavaScript 函數式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向對象的語言,或者只是部分具備一些面向對象的特征。本文將回歸面向對象本意,從對語言感悟的角度闡述為什...

    novo 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<