什么是闭包?1.函数A中直接或间接返回一个函数B,2.函数B中访问函数A中的私有变量或者数据,在外部调用返回的函数B,此时就会形成一个闭包。
我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的
直接返回一个函数:
{
function A(){
let x = 2;
function B(){
console.log(x); //2
}
return B
}
A()()
}
间接返回一个函数:
{
function A() {
let y = 20;
let obj = {
userName: "zhangsan",
sayName: function () {
console.log(this)
console.log(this.userName); //zhangsan
console.log(y) //20
}
}
return obj
}
//写法1 this指向obj对象 obj.sayName()
A().sayName();
//写法2 this指向window 因为fn是全局变量 所以this.userName报错
// let fn = A().sayName;
// fn()
//写法3 this指向obj 因为fn此时代表的是obj这个对象。所以obj.fn的指向还是obj,等同于写法一
let fn = A();
fn.sayName();
}
- 闭包函数的优点
- 延长了变量的生命周期,当内部函数没有执行完,外边函数里的数据不会销毁
- 可以访问函数内部的私有变量
- 闭包函数的缺点
当内部函数没有执行完,外边函数里的数据不会销毁,一直存在,那么就会出现内存占用, 如果过多, 就会导致内存溢出,那么结果就是内存泄漏
{
function A(){
var num = 10; //属于局部变量,函数A执行完以后就立即销毁
function B(){
return num++
}
return B
}
let fn = A();
console.log(fn()); //11
console.log(fn()); //12
console.log(fn()); //13
console.log(fn()); //14
}










网友评论