摘要:原文函數(shù)的純潔性純函數(shù)非純函數(shù)副作用純函數(shù)一個(gè)函數(shù)返回的值只取決于他輸入的值,并且沒(méi)有副作用,那這個(gè)函數(shù)就是純函數(shù)。因此,純函數(shù)無(wú)法對(duì)它的父作用域作出任何修改。更多關(guān)于函數(shù)純潔性的資料
原文:Glossary of Modern JavaScript Concepts: Part 1
函數(shù)的純潔性:純函數(shù)、非純函數(shù)、副作用 純函數(shù)一個(gè)函數(shù)返回的值只取決于他輸入的值,并且沒(méi)有副作用,那這個(gè)函數(shù)就是純函數(shù)。這樣的函數(shù)只要參數(shù)是一樣的,返回的結(jié)果就永遠(yuǎn)只有一個(gè)。以下是一個(gè)例子:
function half(x) { return x / 2; }
half(x)函數(shù)接受x作為參數(shù),返回x值的一半。如果傳入8,那么返回的一定是4.調(diào)用一個(gè)純函數(shù)時(shí),它的結(jié)果可以完全代替這個(gè)純函數(shù),例如我們可以用4代替half(8),無(wú)論在哪里使用都不會(huì)改變這段代碼的最終結(jié)果,這就是純函數(shù)的引用透明性。
純函數(shù)只依賴(lài)它的參數(shù)。例如純函數(shù)不能引用它父作用域的變量(除非這個(gè)變量作為參數(shù)傳入)。因此,純函數(shù)無(wú)法對(duì)它的父作用域作出任何修改。
// some variable that is mutated let someNum = 8; // this is NOT a pure function function impureHalf() { return someNum / 2; }
總結(jié):
純函數(shù)必定帶參數(shù)
輸入一樣,輸出必定一樣
純函數(shù)只改變內(nèi)部狀態(tài)不改變外部狀態(tài)
純函數(shù)無(wú)副作用
純函數(shù)不能調(diào)用非純函數(shù)
非純函數(shù)非純函數(shù)會(huì)改變它作用域外面的狀態(tài)(state)。很多有副作用的函數(shù)都是非純函數(shù)。
// 非純函數(shù)產(chǎn)生副作用 function showAlert() { alert("This is a side effect!"); } // 非純函數(shù)改變外部變量 var globalVal = 1; function incrementGlobalVal(x) { globalVal += x; } // 一個(gè)裝純的非純函數(shù) // 他每次返回的值都不同 function getRandomRange(min, max) { return Math.random() * (max - min) + min; }JavaScript里的副作用
當(dāng)函數(shù)或表達(dá)式修改自己上下文以外的屬性,就是產(chǎn)生了副作用。副作用包括調(diào)用API、操作DOM、調(diào)用alert、數(shù)據(jù)庫(kù)操作等。如果一個(gè)函數(shù)產(chǎn)生副作用,那么他就是非純的。產(chǎn)生副作用的函數(shù)會(huì)改變外部變量,因此讓人捉摸不透,難以測(cè)試。
關(guān)于純潔性的總結(jié)很多高質(zhì)量代碼由調(diào)用純函數(shù)的非純函數(shù)組成。這依然在測(cè)試和不變性上很有優(yōu)勢(shì)。有引用透明性那么就可以寫(xiě)成記憶函數(shù):儲(chǔ)存函數(shù)結(jié)果,然后重用之前儲(chǔ)存的結(jié)果。這可以判斷這個(gè)函數(shù)是否是純函數(shù)。
更多關(guān)于函數(shù)純潔性的資料
Pure versus impure functions
Master the JavaScript Interview: What is a Pure Function?
Functional Programming: Pure Functions
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/88626.html
摘要:我將描述我發(fā)現(xiàn)塑造成功框架的一些哲學(xué)。根據(jù)我的框架開(kāi)發(fā)經(jīng)驗(yàn),我特此冷凝和總結(jié)我認(rèn)為任何成功的框架最重要的哲學(xué)?,F(xiàn)代框架往往是松散耦合的體系結(jié)構(gòu)。全棧框架例如已經(jīng)演變成由松散耦合的組件可以單獨(dú)使用或與第三方交換的框架。 來(lái)源:Philosophies that Shaped Successful Frameworks 在過(guò)去的十年里我們看到了許多軟件框架的出現(xiàn),像 Spring 和 Ru...
摘要:新聞熱點(diǎn)國(guó)內(nèi)國(guó)外,前端最新動(dòng)態(tài)發(fā)布近日,正式發(fā)布新版本中提供了一系列的特性與問(wèn)題修復(fù)。而近日正式發(fā)布,其能夠幫助開(kāi)發(fā)者快速構(gòu)建應(yīng)用。 前端每周清單第 10 期:Firefox53、React VR發(fā)布、JS測(cè)試技術(shù)概述、Microsoft Edge現(xiàn)代DOM樹(shù)構(gòu)建及性能之道 為InfoQ中文站特供稿件,首發(fā)地址為這里;如需轉(zhuǎn)載,請(qǐng)與InfoQ中文站聯(lián)系。從屬于筆者的 Web 前端入門(mén)...
摘要:本文不是標(biāo)準(zhǔn)的中文翻譯,也不是的入門(mén)教程,本文雖然以的常見(jiàn)問(wèn)題切入,但并不適合想要快速了解這些問(wèn)題的人才是快速了解問(wèn)題的正解。盡量以英文原版為基礎(chǔ),為了流暢,可能會(huì)使用某些名詞的中文翻譯,但會(huì)將匹配的英文名詞以此種樣式中出現(xiàn)一次以避免誤解。 簡(jiǎn)單易懂的ECMA規(guī)范導(dǎo)讀1 序 最近混SF,恰巧又逢工作方面有了NodeJS的機(jī)會(huì),迫切地有教別人怎么寫(xiě)JS的需求, 我發(fā)現(xiàn)JS這個(gè)東西其實(shí)...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠?lái)都是中的主導(dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠?lái)都是JavaScript中的主導(dǎo)范式。JavaScript作為一門(mén)多范式編程語(yǔ)言,然而,近幾年,函數(shù)式編程越來(lái)越多得受到開(kāi)發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
摘要:想學(xué)好前端,真的要主動(dòng),然后對(duì)所有的英文文檔耐心一點(diǎn)。在年月日,國(guó)際組織發(fā)布了的第六版,該版本正式名稱(chēng)為,但通常被稱(chēng)為或者。自此,每年發(fā)布一次新標(biāo)準(zhǔn)。但保留了用于依賴(lài)注入的構(gòu)造函數(shù)參數(shù)類(lèi)型。必須在構(gòu)造函數(shù)中聲明屬性,而不是在類(lèi)的代碼體中。 從 TypeScript 到 ES6 到 ES5 在我初學(xué)前端的很長(zhǎng)一段時(shí)間,不愿意碰git,不愿意碰框架,總是嫌麻煩,連ES6也沒(méi)有怎么去弄明白...
閱讀 1697·2023-04-26 01:54
閱讀 1707·2021-09-30 09:55
閱讀 2726·2021-09-22 16:05
閱讀 1957·2021-07-25 21:37
閱讀 2698·2019-08-29 18:45
閱讀 1952·2019-08-29 16:44
閱讀 1956·2019-08-29 12:34
閱讀 1414·2019-08-23 14:02