开包:开包也可以叫函数柯里化,是将接收多个参数的函数转换成一系列使用单个参数的函数
function add(x, y) {
return x + y
}
function addToX(x) {
return function (y) {
return add(x, y)
}
}
const addFive = addToX(5);
addFive(2); // 7
闭包 :
闭包优点:长时间储存变量在内存中,减少全局变量的污染,加强封装性
闭包缺点:占用更多的内存导致内存泄漏,或性能下降
闭包不是回调,回调也不是闭包,回调是函数内执行另一个函数,闭包是函数内返回另一个函数,且返回了父级函数的作用域变量
垃圾回收机制:简单的说,当一个函数被执行完后,其作用域会被收回
function counter() {
let count = 0
return () => {
return ++count
}
}
const c = counter()
console.log(c()) //1
console.log(c()) //2
console.log(c()) //3
使用场景
function walk(step){
if(step == 0){
console.log('结束了')
}else{
step--
walk(step)
}
}
walk(100) //默认传了100
let arr = [1,2,3,4,5,1,2,3,4,5,6]
let setArr = new Set(arr)
console.log(setArr) //返回set数据结构 Set(3) {1,2,3,4,5,6,7}
//es6的 ... 运算符
console.log([...setArr]) //输出 [1, 2, 3, 4, 5, 6]
console.log(...setArr) //输出 1, 2, 3, 4, 5, 6
let arr1 = [1,2,3,4,5,1,2,3,4,5,6]
let arr2 = []
for(let i in arr1){
if(arr2.indexOf(arr1[i]) === -1){ //如果数组中没有当前数值,indexOf 则返回-1,
arr2.push(arr1[i])
}
}
console.log(arr2)