闭包及递归
1. 闭包
1.1 闭包的定义
定义在一个函数内部的函数
1.2 闭包的作用
可以访问父函数中的变量
可以锁住父函数中的变量
1.2.1 可以访问父函数中的变量
var name = 'window';
var object = {
name: 'object',
getName: function () {
var name = 'getName';
function fn() {
console.log(name);//getName
console.log(this.name);//window
}
fn();
}
}
object.getName();
1.2.2 可以锁住父函数中的变量
function random(min, max) {
var num = Math.floor(Math.random() * (max - min) + min);
return function () {
console.log(num)
}
}
var result = random(1, 10);
console.log(result);//函数
result();
result();
result();
result();
// 闭包可以锁住父函数中的变量 所以每次输出的数字一样
1.3 闭包的本质
父函数作用域成为永恒作用域
2. 递归
2.1 递归的定义
函数自己调用自己
2.2 特点
类似于循环
必须有结束语句
2.3 递归的深拷贝
var obj = {
name: 'obj',
age: 20,
object: {
name: "object",
age: { age: 20 }
},
arr: [1, 2, 3]
}
var newObj = {}
// 递归函数
function recursion(newObj, obj) {
for (key in obj) {
// 判断对象
if (obj[key] instanceof Object) {
// 进行递归深拷贝
newObj[key] = {}
recursion(newObj[key], obj[key])
}
// 判断数组
else if (obj[key] instanceof Array) {
newObj[key] = []
recursion(newObj[key], obj[key])
} else {
newObj[key] = obj[key]
}
}
}
recursion(newObj, obj)
newObj.name = 'newObj';
newObj.object.name = 'newObject';
newObj.object.age.age = 22;
console.log(obj);
console.log(newObj);