react side effect
一. 在计算机科学中有副作用的概念。摘自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修改(影响)了他的作用域之外的变量。比如修改非局部变量,修改静态局部变量,修改可变参数。
命令式编程通常产生副作用,用于更新系统的状态。( 命令式程序由计算机执行的命令组成。命令式编程着重描述了程序进行操作。)
声明性编程通常表达计算逻辑而不描述其控制流程。没有副作用。
函数式编程的定义倾向于纯函数,输入确定,输出就确定,只要保证接口不变,内部实现与外部无关,因此是没有副作用的。但是在日常的coding中,通常会有变量在函数内部,so是有副作用的。但是可以利用副作用,打个log啥的。
二.有个大体的概念后,会知道副作用不是特定于react的概念。抽象点表达式是指任何不纯的函数,翻译一下就是影响了其正在执行的函数之外的变量(也可能是其他,变量易于理解)。
在react中产生副作用的操作比如网络请求,它使您的代码与第三方通信(从而发出请求,导致记录日志,保存或更新缓存,功能之外的各种效果)。
再比如不让在constructor里网络请求,因为网络请求回来的有可能react没有挂到HTML上,那么这个请求就没啥用(副作用!)。
可以看看这个帖子
三. 在编程中控制副作用
并不是函数不纯就会产生副作用。比如react做个log组件,在dev环境中log,生产环境中不log,那么函数中肯定会有环境变量的判断,这样导致了函数的不纯,但是却帮助了我们更好的debug。比如redux,redux-log。(组件化,插件化,就是爽)。