js 函数的副作用分析_javascript技巧

函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性。严格的函数式语言要求函数必须无副作用。
函数的副作用相关的几个概念, 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,运算结果通过函数返回给外部(出口)

时间: 2024-10-29 15:43:13

js 函数的副作用分析_javascript技巧的相关文章

JS函数重载的解决方案_javascript技巧

在面向对象的编程中,很多语言都支持函数重载,能根据函数传递的不同个数.类型的参数来做不同的操作,JS对它却不支持,需要我们额外做些小动作. 在JS的函数执行上下文中有一个名为arguments的有意思的变量,它以数组的形式存储了函数执行时传递过来的所有参数,即使函数定义没有定义这 么多个形参.还有一个特别之处就是跟Array类型相比,arguments变量有且只有一个length属性,Array的方法,例如push.pop 等,它并不具备,它只是一个"伪数组":具有length属性,存

setinterval()与clearInterval()JS函数的调用方法_javascript技巧

本文实例讲述了setinterval()与clearInterval()JS函数的调用方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.

js常用系统函数用法实例分析_javascript技巧

本文实例讲述了js常用系统函数用法.分享给大家供大家参考. 具体代码如下: 复制代码 代码如下: <html> <head> </head> <body> <script type="text/javascript"> //1. escape()函数,把字符串转成各计算机平台通用的unicode编码:解码(转回去)则用enescape(). var str = '王美人'; document.write(escape(str)

JS中confirm,alert,prompt函数使用区别分析_javascript技巧

window.alert:参数,只有一个,显示警告框的信息; 无返回值. <script> window.alert("确定.") </script> window.confirm : 参数就只有一个.显示提示框的信息. 按确定,返回true; 按取消返回false. <script> var bln = window.confirm("确定吗?"); alert(bln) </script> window.promp

JS重载实现方法分析_javascript技巧

本文实例分析了JS重载实现方法.分享给大家供大家参考,具体如下: 重载是面向对象语言里很重要的一个特性,JS中没有真正的重载,是模拟出来的(因为js是基于对象的编程语言,不是纯面向对象的,它没有真正的多态:如继承.重载.重写) 一.什么时候用重载? 举例: function getDataTop10(){ alert("返回前10条数据"); } 后来需求改了,需要获得20条数据,而getDataTop10又被很多函数调用了,整体替换可以但麻烦,这时可以用重载 进而引出什么是重载:函数

JS高级运动实例分析_javascript技巧

本文实例分析了JS高级运动.分享给大家供大家参考,具体如下: 一.链式运动框架 1.他需要一个回调函数,在运动停止时,开始下一次运动(执行函数) 多物体运动框架改为如下: function startMove(obj,attr,iTarget,fn){ ... if(iCur==iTarget){ clearInterval(obj.timer); fn(); }... }; 然后就可以用它,比如先变宽再变高最后变透明度 startMove(this,'width',300,function()

JS继承用法实例分析_javascript技巧

本文实例分析了JS继承的用法.分享给大家供大家参考.具体分析如下: 继承 : 子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 ) 属性的继承 : 调用父类的构造函数 call 方法的继承 : for in :  拷贝继承 (jquery也是采用拷贝继承extend) 1. 拷贝继承 function Person (name){ this.name = name; } Person.prototype.showName =function (){ alert(this.name); }

js轮盘抽奖实例分析_javascript技巧

现在学习到了过渡效果了,已经开始有做动画效果的意识了,会实现一些比较炫的小玩意,一个网页加入过渡动画效果,会让人看起来很有美观,不僵硬,有看头,动画是一个网页美观的主要体现之一,下面做个使用个过渡效果实现的抽奖例子.  先来效果图:  这个的实现需要使用到一些js代码. 所需图片: 这张图是pointer.png的位置的. turntable-bg.jpg这张是背景图,在背景位置. 这张是turntable.png位置的.   需要这三张图片,如果要实现一下,直接另存这三图片引入进去即可.如果不

JS前端笔试题分析_javascript技巧

本文实例分析了JS前端笔试题.分享给大家供大家参考,具体如下: 1.如何根据逗号分隔的字符串创建数组呢?请为下面的字符串创建一个数组,并访问第三个元素:"cats,dogs,birds,horses" 知识点:数组和字符串的转换.考察split() 方法.把一个字符串分割成字符串数组(将字符串按某个字符切割成若干个字符串,并以数组形式返回) var animalString="cats,dogs,birds,horses"; var animalArray=anim