• 纯函数

一、纯函数

定义:纯函数是指不依赖并且不修改其作用域之外的函数。通过以下几个示例来认识纯函数:

 var a = 10;
//纯函数
function foo(num){
return num + 5;
}
//非纯函数:函数内依赖了外部变量a
function fun(num){
return num + a;
}
console.log(foo(a)); //15 -->这里传入a变量为什么还是纯函数呢?
console.log(fun(5)); //

给函数传入参数时,函数是通过自身的形参变量接收这个参数的值(栈内存),因为上面示例传入的是一个原始值类型的参数,所以函数不会依赖外部参数a。但是要注意的是如果函数执行时传入的是一个引用值类型的参数,并且在函数内部没有实现深克隆,而是直接依赖引用值类型实参的栈内存的话,那这个函数就不是纯函数,反之亦然。

 // 遍历对象 for(var prop in obj)
// 1.判断是不是原始值 typeOf() object
// 2.判断是数组还是对象 instanceof toString constructor
// 3.建立相应的数组或对象
//递归
function deepClone(origin, target){
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
objStr = "[object Object]";
for(var prop in origin){ //object.hasOwnProperty(attribute)判断attribute是不是自己本身的属性(即不拷贝原型链上的属性)
if(origin.hasOwnProperty(prop)){
if(origin[prop] !== null && typeof(origin[prop]) == 'object'){
//origin[prop]调用toString方法的返回值是[object Array],target则赋值[],即为数组
if(toStr.call(origin[prop]) == arrStr){
target[prop] = toStr.call(target[prop]) == arrStr ? target[prop] : [] ;
}else{
target[prop] = toStr.call(target[prop]) == objStr ? target[prop] : {};
}
//遇到引用值,应用递归实现深度克隆
deepClone(origin[prop],target[prop]);
}else{
target[prop] = origin[prop];
}
}
}
return target;
}

克隆方法:deepClone

 //非纯函数
var arr = [{name:"HTML"}];
function foo(arrF){
arrF.push({name:"CSS"});
return arrF;
}
var _arr = foo(arr);
_arr[0].name = "HTML5";
console.log(arr[0].name); //HTML5
//纯函数
var arr = [{name:"HTML"}];
function foo(arrF){
var arrTarget = [];
deepClone(arrF,arrTarget).push({name:"CSS"}); //采用深克隆
return arrTarget;
}
var _arr = foo(arr);
_arr[0].name = "HTML5";
console.log(arr[0].name); //HTML

从实际的应用来看,纯函数可以说就是不印象纯函数之外的环境变量。这说起来和前面的纯函数定义几乎一样,那为什么需要用到纯函数呢?在什么地方会用到纯函数呢?

在编写代码的时候,不可避免的会包含一些bug。虽然不可能避免,但是我们有必要将代码的错误影响降到有限的范围内,防止一个bug影响到其他代码,让bug有迹可循。这时候就可以使用纯函数来实现这样的编程思想。

纯函数为什么可以做到这一点呢?

比如在vue的组件化开发实现状态共享,有多个不同层级不同父子级关系的组件共享着一个状态,共享状态之间采用纯函数的方式来实现,这样就可以实现当一个组件出现bug时,只能是自身或者是上级传递过来的参数有问题,而不会受到不相关联的组件的影响,同时也不会影响到其他组件的运行,这也就是纯函数的规避bug风险的重要思想,对于代码测试起到非常大的作用。

JavaScript使用纯函数避免bug的更多相关文章

  1. JavaScript 面试:什么是纯函数?

    原文:Eric Elliott  译文:众成翻译 www.zcfy.cc/article/master-the-javascript-interview-what-is-a-pure-function ...

  2. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  3. JavaScript—纯函数

    定义 一个函数的返回结果只依赖它的参数,而且在计算过程中不会产生其他副作用,也就是不会对外部的数据造成影响或改变. 理解:函数的返回结果只依赖它的参数 const a= 1; const b= (c) ...

  4. 深入理解javascript:揭秘命名函数表达式

    这是一篇转自汤姆大叔的文章:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 前言 网上还没用发现有人对命名函数表达式进去重复深 ...

  5. Javascript的匿名函数

    一.什么是匿名函数?在Javascript定义一个函数一般有如下三种方式:函数关键字(function)语句:function fnMethodName(x){alert(x);}函数字面量(Func ...

  6. 初涉JavaScript模式 (8) : 函数 【概述】

    什么是函数 函数,是一个大型程序中的某部份代码,由一个或多个语句块组成.它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性.(维基百科) 函数的特点 第一类对象 在JavaScript世界中 ...

  7. C#中的函数式编程:递归与纯函数(二)

    在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential transparency)来定义的.如果一个 ...

  8. javascript使用parseInt函数时需要注意的一些问题

    这个问题大家可能会忽视,我在项目中就遇到了.写了提醒一下大家!!! 在用javascript的parseInt函数时,parseInt("08")或者parseInt(" ...

  9. Javascript中的函数数学运算

    1.Math函数与属性使用语法 Math.方法名(参数1,参数2,...); Math.属性; 说明 Math函数可以没有参数,比如Math.random()函数,或有多个参数,比如Math.max( ...

随机推荐

  1. vscode 设置 eclipse 快捷键

    点击安装之后,默认就是要ecliplse快捷键了 注意:部分快捷键可能会由于和原来的冲突而失效,例如快速在“下面插入行” ,我还是不能使用ecliplse的Shift+Enter,而要用Ctrl+En ...

  2. android Activity,Fragment,Application内存状态监听及等级

    @Override public void onTrimMemory(int level) { super.onTrimMemory(level); switch (level){ case TRIM ...

  3. Hibernate3核心API-Session接口

    Session是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作.此对象的生命周期很短.Sessio ...

  4. Des加密类

    需要导入Base64.jar包 import java.io.IOException; import java.security.SecureRandom; import javax.crypto.C ...

  5. element-ui分页当前在哪一页,刷新页面保留当前分页

  6. 开题报告中如何将一段文字插入到word表格中

    1,举例如下,打开空白word,设计一个20列的表格.任意一段文字. 2,选中这段文字,点击替换按钮.查找内容为“?”,替换为“^&,”(后面是逗号),并勾选“使用通配符”. 3,全部替换得到 ...

  7. R语言常用包简介

  8. 1.React中的虚拟DOM

    1.state 数据 2.JSX模板 3.数据+ 模板 结合,生成真实的DOM,来显示 4.state发生改变 5.数据 + 模板 结合,生成真实的DOM,替换原始的DOM 缺陷: 第一次生成了一个完 ...

  9. Books Exchange (easy version)   CodeForces - 1249B2

    The only difference between easy and hard versions is constraints. There are nn kids, each of them i ...

  10. Angular里使用(image-compressor.js)图片压缩

    参考资料: http://www.imooc.com/article/40038 https://github.com/xkeshi/image-compressor 示例代码: <nz-upl ...