闭包是什么
1、函数中返回了一个函数
function fn () {
let a1 = 1
return function () {
return a1
}
}
闭包存在的意义
1、延长变量的声明周期
2、创建私有环境
let a ='123'
function fn1(){
// 此处是一个私有环境即函数作用域
let b = '456'
console.log(a)
}
console.log(b)// 此处执行会报错
fn1()
作用域链
let name = '1'
function fn () {
let name = '2'
function fn1 () {
let name = '3'
console.log(name) // 输出 '3' 作用域查找规则 就近原则
}
fn1()
}
fn()
闭包会常驻内存
慎用闭包 防止内存泄漏
let handleCounter = function () {
let num = 0;
function changeNum (val) {
num += val
}
return {
add: function () {
changeNum(1)
},
reduce: function () {
changeNum(-1)
},
value: function() {
return num
}
}
}
let count1 = handleCounter()
let count2 = handleCounter()
count1.add()
count1.add()
count2.add()
console.log(count1.value()); // 输出 2
console.log(count2.value()); // 输出 1
以上说明 虽然 const1和const2 通过同一个闭包创建的 但是他们都有独自的词法作用域
vue中data是一个函数,生成独自的作用域避免变量互相干扰也是通过这个实现的