成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

BlackHole1 / 637人閱讀

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

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

函數(shù)式語言中的函數(shù)

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

函數(shù)是運(yùn)算元

在函數(shù)內(nèi)保存數(shù)據(jù)

函數(shù)內(nèi)的運(yùn)算對(duì)函數(shù)外無副作用

函數(shù)是運(yùn)算元

普通的函數(shù)調(diào)用時(shí),可以抽象的理解為:函數(shù)就是一個(gè)運(yùn)算符,傳入的參數(shù)是運(yùn)算元;
但當(dāng)JavaScript中的函數(shù)作為另一個(gè)函數(shù)的參數(shù)使用時(shí),是傳遞引用的,這個(gè)“傳入?yún)?shù)”就可以被理解為是一個(gè)運(yùn)算元。由此的結(jié)論是,(作為“傳入?yún)?shù)”的)函數(shù)具有運(yùn)算元的含義,“函數(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)的私有變量可以被修改,而且當(dāng)再次“進(jìn)入”到該函數(shù)內(nèi)部時(shí),這個(gè)被修改的狀態(tài)仍將持續(xù)。下面的例子說明了這個(gè)特性:

  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

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

  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)的運(yùn)算對(duì)函數(shù)外無副作用

這一特性的含義在于:

函數(shù)使用入口參數(shù)進(jìn)行運(yùn)算,而不修改它(作為值參數(shù)而不是變量參數(shù)使用)

在運(yùn)算過程中不會(huì)修改函數(shù)外部的其他數(shù)據(jù)的值(例如全局變量)

運(yùn)算結(jié)束后通過“函數(shù)返回”向外部系統(tǒng)傳值

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78028.html

相關(guān)文章

  • JavaScript 闖關(guān)記》之簡介

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

    baihe 評(píng)論0 收藏0
  • 前端每周清單第 10 期:Firefox53、React VR發(fā)布、Microsoft Edge現(xiàn)代

    摘要:新聞熱點(diǎn)國內(nèi)國外,前端最新動(dòng)態(tài)發(fā)布近日,正式發(fā)布新版本中提供了一系列的特性與問題修復(fù)。而近日正式發(fā)布,其能夠幫助開發(fā)者快速構(gòu)建應(yīng)用。 前端每周清單第 10 期:Firefox53、React VR發(fā)布、JS測(cè)試技術(shù)概述、Microsoft Edge現(xiàn)代DOM樹構(gòu)建及性能之道 為InfoQ中文站特供稿件,首發(fā)地址為這里;如需轉(zhuǎn)載,請(qǐng)與InfoQ中文站聯(lián)系。從屬于筆者的 Web 前端入門...

    MingjunYang 評(píng)論0 收藏0
  • JavaScript語言特性以及重要版本

    摘要:通常一個(gè)完成的不僅僅包含了還包括了以及相關(guān)版本該版本在中使用?;谠秃瘮?shù)先行的語言使用基于原型的的繼承機(jī)制,函數(shù)是的第一等公民其他相關(guān)的語言特性編譯型語言把做好的源程序全部編譯成二進(jìn)制代碼的可運(yùn)行程序。 轉(zhuǎn)載請(qǐng)注明出處,創(chuàng)作不易,更多文章請(qǐng)戳 https://github.com/ZhengMaste... 前言:JavaScript誕生于1995年,它是一門腳本語言,起初的目...

    Yangder 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)編程

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

    csRyan 評(píng)論0 收藏0
  • 面向?qū)ο蟮?JavaScript

    摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街?,?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對(duì)這一門語言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從?duì)語言感悟的角度闡述為什...

    novo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<