闭包
简而言之,闭包就是一个函数可以访问函数外面的变量,即: 函数 + 自由变量
// 这是一个简单的例子:
function add(){
var x = 1
function add1(){
console.log(x) // 访问了外部的变量
}
return add1
}
var i = add()
// 此时的 i() 就相当于 add() 也就是 add1()
i() // 1
那么闭包有什么作用呢
1、避免全局污染,因为闭包使用的是局部变量
2、提供对局部变量的间接访问
3、维持变量使其不被垃圾回收
但当闭包使用不当后,会造成内存泄漏,举例说明:
function Number(){}
function closure(){
var x = new Array(100000).fill(null).map(e=>new Number())
return function inner(){
return x
}
}
// 函数由于被外部持有, 自身不会释放, 同时闭包也不会释放
var fn = closure()
// 此时 x 仍存在内存中,解决优化:
fn = null
递归
程序不断调用自身的过程
举例说明:
function fn(){
fn()
}
fn()
// 此时的 fn 就是一个递归函数,但会出现栈内存溢出
为了防止栈内存溢出,我们需要为递归设置条件:
1、设置递归的执行条件
function fn(i){
console.log(i)
i += 1
if(i<10){
fn(i)
}
}
fn(1) // 1 2 3 4 5 6 7 8 9
2、设置递归的结束条件
function fn(i){
console.log(i)
i += 1
if(i > 10) return;
fn(i)
}
fn(6) // 6 7 8 9 10
练习:计算 1 + 2 + 3 + ..... + n 的和
function sum(n){
if(n === 1) return 1;
return n + sum(n-1)
}
sum(6) // 21