js 函数的副作用分析

 更新时间:2011年08月23日 22:54:54   作者:  
函数副作用 指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。
函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性。严格的函数式语言要求函数必须无副作用。
函数的副作用相关的几个概念, Pure Function、 Impure Function、 Referential Transparent。
纯函数 ( Pure Function )
输入输出数据流全是显式(Explicit)的。 显式(Explicit)的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值。函数从函数外部接受的所有输入信息都通过参数传递到该函数内部。函数输出到函数外部的所有信息都通过返回值传递到该函数外部。
非纯函数 ( Impure Function )
与之相反。 隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如读取/修改全局变量,都叫作以隐式的方式和外界进行数据交换。
引用透明 ( Referential Transparent )
引用透明的概念与函数的副作用相关,且受其影响。 如果程序中两个相同值得表达式能在该程序的任何地方互相替换,而不影响程序的动作,那么该程序就具有引用透明性。它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。
以下示例说明了引用透明与函数副作用的结合
复制代码 代码如下:

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中的函数可以访问、修改全局变量(或定义在函数外的变量),如下
复制代码 代码如下:

var a = 5;
function fun(){
a = 10;
}
fun(); // a 变成了10

JS中要想保证函数无副作用这项特性,只能依靠编程人员的习惯,即
1,函数入口使用参数运算,而不修改它
2,函数内不修改函数外的变量,如全局变量
3,运算结果通过函数返回给外部(出口)

相关文章

  • 引用其它js时如何同时处理多个window.onload事件

    引用其它js时如何同时处理多个window.onload事件

    引用其它js时,其js却使用了window.onload事件,这样的话,引入的页面的onload事件就有可能执行不了,那么该如何解决呢?祥看下文
    2014-09-09
  • Validform表单验证总结篇

    Validform表单验证总结篇

    这篇文章主要介绍了Validform表单验证,包括通用表单验证方法的知识,本文给大家介绍的非常详细具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • JavaScript导航脚本判断当前导航

    JavaScript导航脚本判断当前导航

    这篇文章主要介绍了JavaScript导航脚本判断当前导航的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • js中的referrer返回上一页使用介绍

    js中的referrer返回上一页使用介绍

    js中的referrer想必大家并不陌生吧,在本文将为大家详细介绍其是如何使用的,感兴趣的朋友可以参考下,希望对大家有所帮助
    2013-09-09
  • javascript基础知识之html5轮播图实例讲解(44)

    javascript基础知识之html5轮播图实例讲解(44)

    这篇文章主要为大家详细介绍了javascript基础知识之html5轮播图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • H5页面跳转小程序的3种实现方式

    H5页面跳转小程序的3种实现方式

    这篇文章主要给大家介绍了关于H5页面跳转小程序的3种实现方式,说出来你可能不信,每位商家几乎都会h5转跳到小程序、H5转跳至小程序的应用范围十分广阔,需要的朋友可以参考下
    2023-08-08
  • js 内存释放问题

    js 内存释放问题

    这里之所以使用setTimeout(),因为可以彻底回收当前所有对象,防止变量之间的引用导致释放失败,可以当作一个保障措施,按照道理来说,这里不会执行了。
    2010-04-04
  • JavaScript 代码压缩工具小结

    JavaScript 代码压缩工具小结

    为了使页面更快的完成加载,经常需要对javascript/css代码进行压缩以减小体积,这里简单列一下用过的压缩工具,同时也作为存档
    2012-02-02
  • JavaScript中Form表单技术汇总(推荐)

    JavaScript中Form表单技术汇总(推荐)

    这篇文章主要介绍了JavaScript中Form表单技术的相关资料,包括简单的表单验证和正则表达式验证,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • javascript中parseInt()函数的定义和用法分析

    javascript中parseInt()函数的定义和用法分析

    这篇文章主要介绍了javascript中parseInt()函数的定义和用法,较为详细的分析了parseInt()函数的定义及具体用法,以及参数使用时的注意事项,需要的朋友可以参考下
    2014-12-12

最新评论