• 纯函数

 一、纯函数

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

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

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

 1 // 遍历对象 for(var prop in obj)
 2 // 1.判断是不是原始值    typeOf() object 
 3 // 2.判断是数组还是对象 instanceof toString constructor
 4 // 3.建立相应的数组或对象
 5 //递归
 6 function deepClone(origin, target){
 7     var target = target || {},
 8         toStr = Object.prototype.toString,
 9         arrStr = "[object Array]";
10         objStr = "[object Object]";
11     for(var prop in origin){
12 
13         //object.hasOwnProperty(attribute)判断attribute是不是自己本身的属性(即不拷贝原型链上的属性)       
14         if(origin.hasOwnProperty(prop)){
15             if(origin[prop] !== null && typeof(origin[prop]) == 'object'){
16                 //origin[prop]调用toString方法的返回值是[object Array],target则赋值[],即为数组
17                 if(toStr.call(origin[prop]) == arrStr){
18                     target[prop] = toStr.call(target[prop]) == arrStr ? target[prop] : [] ;
19                 }else{
20                     target[prop] = toStr.call(target[prop]) == objStr ? target[prop] : {};
21                 }
22                 //遇到引用值,应用递归实现深度克隆
23                 deepClone(origin[prop],target[prop]);
24             }else{
25                 target[prop] = origin[prop];
26             }    
27         }
28     }
29     return target;
30 }
克隆方法:deepClone

相关文章: