闭包函数(closures)
闭包函数也叫 匿名函数
闭包函数( closures ) 允许创建一个没有指定名称的函数,最经常用作回调函数参数的值。
闭包函数没有函数名称,直接在function()传入变量即可— 使用时 将定义的 变量 当作函数 来处理
闭包的四大特点
1、函数嵌套函数
2,内部函数可以访问外部函数的变量
3,参数和变量不会被回收
4,函数作为参数 / 返回值的时候
案例:(当函数执行完,占用内存,不会销毁)
// addCount 函数作为返回值
function addCount() {
var count = 0;
var addCount = function() {
count++;
}
return addCount;
}
document.body.addEventListener("click", addCount);
递归函数
递归:函数自己调用自己
在递归的过程中会出错:内存溢出,超出最大的堆栈大小
递归要写一个结束的条件
案例:求 1+2+3+4+...+n(递归方法)
function getSum(n){
if ( n === 1){
return 1
}
return n + getSum(n - 1)
}
getSum(9)
解析:
当 n = 9时;那么该函数等于
9 + getSum(8)
9 + 8 + getSum(7)
9 + 8 + 7 + getSum(6)
9 + 8 + 7 + 6 + getSum(5)
9 + 8 + 7 + 6 + 5+ getSum(4)
9 + 8 + 7 + 6 + 5 + 4 + getSum(3)
9 + 8 + 7 + 6 + 5 + 4+ 3 + getSum(2)
9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + getSum(1)
9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45
解答流程就是如此,等到 n = 1 时候,此函数才会结束,如果没有结束条件,他会一直执行下去,最终导致内存溢出,超出最大的堆栈大小
浅拷贝 与 深拷贝
1,定义
浅拷贝:只能拷贝数据的第一层,第二次数据是展示原来堆栈内存中的值,并不是自己堆栈中数据;第二层中数据改变,是修改原来堆栈内存中的值
深拷贝:把数据结构全部拷贝下来,所有数据都在自己堆栈内存中的数据,可以直接进行修改
注:ES6中的三个点拷贝对象,是浅拷贝,并且 Object.assign()也是浅拷贝
展示:
最原始的值,修改之后,发现他直接修改了原来堆栈内存中的值
2,常见的一些拷贝方法
-
浅拷贝:
- ES6:object.assign()
- 展开运算符……
- 封装函数实现for in
-
深拷贝:
- JSON方法
- 递归(自己调用自己)方法 判断第一层属性的类型,用for…in实现遍历和复制,多层拷贝对象的属性
- Object.created();
案例
// 配置数据
var a = { name : “hello” };
var obj1 = {
name: 'zs',
age: 18,
dog: {
name: '金毛',
age: 2
},
friends: ['ww', 'lil']
}
var obj2 = {};
浅拷贝
// 1,Object.assign() -浅拷贝
var b = Object.assign( { },a ); // { name : “hello” }
// 2,展开运算符…… - 浅拷贝
var b = {... a}
// 3,封装函数实现for in
function copy(obj){
var result = { };
for(var attr in obj ){
result [attr] = obj[attr];
}
return result;
}
深拷贝
* 封装函数实现for in
// 1,JSON方法-深拷贝
var obj2 =JSON.parse(JSON.stringify(obj1))//
// 2,递归-深拷贝
function deepCopy(o1, o2) {
for (var k in o1) {
//如果第一层中的属性是数组复杂类型
if (o1[k] instanceof Array) {
o2[k] =[];//如果o1[k]是数组,那就给o2[k]也准备一个数组存放拷贝过来的内容
deepCopy(o1[k], o2[k]);
}
}
}
// 3,Object.create()具体使用方法
var obj = {name:'lisi'};
var newObj = Object.create(obj); //newObj的原型(proto)指向obj,具备了obj的属性和方法
网友评论