js函数的副作用分析
JS 函数 分析 副作用
2023-06-13 09:14:30 时间
函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性。严格的函数式语言要求函数必须无副作用。
函数的副作用相关的几个概念,PureFunction、ImpureFunction、ReferentialTransparent。
纯函数(PureFunction)
输入输出数据流全是显式(Explicit)的。显式(Explicit)的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值。函数从函数外部接受的所有输入信息都通过参数传递到该函数内部。函数输出到函数外部的所有信息都通过返回值传递到该函数外部。
非纯函数(ImpureFunction)
与之相反。隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如读取/修改全局变量,都叫作以隐式的方式和外界进行数据交换。
引用透明(ReferentialTransparent)
引用透明的概念与函数的副作用相关,且受其影响。如果程序中两个相同值得表达式能在该程序的任何地方互相替换,而不影响程序的动作,那么该程序就具有引用透明性。它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。
以下示例说明了引用透明与函数副作用的结合
复制代码代码如下:
函数的副作用相关的几个概念,PureFunction、ImpureFunction、ReferentialTransparent。
纯函数(PureFunction)
输入输出数据流全是显式(Explicit)的。显式(Explicit)的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值。函数从函数外部接受的所有输入信息都通过参数传递到该函数内部。函数输出到函数外部的所有信息都通过返回值传递到该函数外部。
非纯函数(ImpureFunction)
与之相反。隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如读取/修改全局变量,都叫作以隐式的方式和外界进行数据交换。
引用透明(ReferentialTransparent)
引用透明的概念与函数的副作用相关,且受其影响。如果程序中两个相同值得表达式能在该程序的任何地方互相替换,而不影响程序的动作,那么该程序就具有引用透明性。它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。
以下示例说明了引用透明与函数副作用的结合
result1=(fun(a)+b)/(fun(a)-c);
temp=fun(a);
result2=(temp+b)/(temp-c);
如果函数没有副作用,那么result1和result2将是等价的。然而如果fun有副作用,比如让b或c加1,那么result1和result2将不相等。因此,副作用违背了引用透明性。
在JavaScript中,引入了函数。但显然JS中的函数可以访问、修改全局变量(或定义在函数外的变量),如下
vara=5;
functionfun(){
a=10;
}
fun();//a变成了10
JS中要想保证函数无副作用这项特性,只能依靠编程人员的习惯,即
1,函数入口使用参数运算,而不修改它
2,函数内不修改函数外的变量,如全局变量
3,运算结果通过函数返回给外部(出口)
相关文章
- js中四舍五入的方法_JS取整
- JS学习笔记 (五) 函数进阶
- JS函数hook
- js函数柯里化-面试手写版
- 初识vue.js模板语法
- JS Object对象的静态函数
- JS生成随机数(random()函数)
- JS在Oracle中的应用(js如何oracle)
- 从前端JS里请求Redis资源,搭建高性能应用(前端js请求redis)
- Opacity.js
- JS中处理与当前时间间隔的函数代码
- js延迟加载改变JS的位置加快网页加载速度
- js获取坐标通过JS得到当前焦点(鼠标)的坐标属性
- 关于JS字符串函数String.replace()
- Mac/Windows下如何安装Node.js
- js判断undefined类型示例代码
- js校验表单后提交表单的三种方法总结
- 一个判断抢购时间是否到达的简单的js函数
- js中匿名函数的创建与调用方法分析
- js常用系统函数用法实例分析
- Node.js文件操作详解