一. 在計算機科學中有副作用的概念。摘自wiki:
In computer science, an operation, function or expression is said to have a side effect if it modifies some state variable value(s) outside its local environment, that is to say has an observable effect besides returning a value (the main effect) to the invoker of the operation. State data updated "outside" of the operation may be maintained "inside" a stateful object or a wider stateful system within which the operation is performed. Example side effects include modifying a non-local variable, modifying a static local variable, modifying a mutable argument passed by reference, performing I/O or calling other side-effect functions. In the presence of side effects, a program's behaviour may depend on history; that is, the order of evaluation matters. Understanding and debugging a function with side effects requires knowledge about the context and its possible histories.
個人理解:某個function修改(影響)了他的作用域之外的變量捌刮。比如修改非局部變量碰煌,修改靜態(tài)局部變量,修改可變參數(shù)绅作。
命令式編程通常產(chǎn)生副作用芦圾,用于更新系統(tǒng)的狀態(tài)。( 命令式程序由計算機執(zhí)行的命令組成俄认。命令式編程著重描述了程序進行操作个少。)
聲明性編程通常表達計算邏輯而不描述其控制流程眯杏。沒有副作用役拴。
函數(shù)式編程的定義傾向于純函數(shù)钾埂,輸入確定,輸出就確定褥紫,只要保證接口不變髓考,內部實現(xiàn)與外部無關部念,因此是沒有副作用的。但是在日常的coding中儡炼,通常會有變量在函數(shù)內部,so是有副作用的乌询。但是可以利用副作用,打個log啥的妹田。
二.有個大體的概念后唬党,會知道副作用不是特定于react的概念鬼佣。抽象點表達式是指任何不純的函數(shù),翻譯一下就是影響了其正在執(zhí)行的函數(shù)之外的變量(也可能是其他晶衷,變量易于理解)房铭。
在react中產(chǎn)生副作用的操作比如網(wǎng)絡請求,它使您的代碼與第三方通信(從而發(fā)出請求翁狐,導致記錄日志,保存或更新緩存露懒,功能之外的各種效果)懈词。
再比如不讓在constructor里網(wǎng)絡請求辩诞,因為網(wǎng)絡請求回來的有可能react沒有掛到HTML上坎弯,那么這個請求就沒啥用(副作用!)译暂。
可以看看這個帖子
三. 在編程中控制副作用
并不是函數(shù)不純就會產(chǎn)生副作用。比如react做個log組件外永,在dev環(huán)境中l(wèi)og伯顶,生產(chǎn)環(huán)境中不log,那么函數(shù)中肯定會有環(huán)境變量的判斷阅签,這樣導致了函數(shù)的不純愉择,但是卻幫助了我們更好的debug锥涕。比如redux,redux-log层坠。(組件化刁笙,插件化疲吸,就是爽)摘悴。