想要好好的理解闭包,你得首先理解作用域。别说了,赶紧去看作用域吧,?,这世界就是如此残酷。好,言归正传,我们是来学习闭包的。O(∩_∩)O
简单点 这就是闭包
// 闭包;函数前天函数;内部函数就是闭包
function outerfn() {
function interfn() { } //这就是闭包函数
}
菜来了!?
闭包只要记住:
- 闭包产生是:函数内嵌套函数;
- 闭包函数在外面被调用,访问;
- 闭包可以访问外部的变量,但是外部的变量不能访问内部;
- 闭包可以保持对定义时的作用域的引用,使之不被销毁,长生不老。
// 闭包函数能不能用外部定义的变量?
// 涉及到作用域链 函数内部使用变量,如果函数内部有就使用,没有就回去上一层去找,一直找到全局环境下
//简单理解就是一层一层套下来,使用变量的时候一层一层往外找
function outerfn() {
let a = 10
function interfn() {
console.log(a);
}
// 如果使用outerfn需要把闭包return出去,当时用outerfn得时候其实是把interfn赋值给了outerfn
return interfn
}
let fn = outerfn()
fn()
输出的肯定是10
那么就有的同学问了 为什么是10呢?
麻烦你看一下上面好吗?
正常情况下 函数执行完成,内部变量会被销毁,那么有的同学就问了 为啥要销毁呢 ? 你是十万个为什么吗? 问就是 释放内存空间
在函数外面是不能调用函数内部的a, 当执行这个函数的时候可以调用的,函数执行完就被释放了 没了懂吗 a没了
闭包函数为什么不会销毁:内部函数没有执行完成,当调用外部函数时,内部函数return 给了外部函数,还能被调用,能被调用,外部变量不会被销毁 ,也是闭包的一个特性
闭包的应用
闭包可以干什么呢 ? 可以封装一段代码 实现模块化
先看下面这段代码
let a = 10
let b = 20
function add() {
return a + b
}
function acc() {
return a - b
}
let result1 = add()
let result2 = acc()
console.log(result1);
console.log(result2);
有什么问题呢?
我们定义了 两个全局变量和全局函数 这么多代码看着一点都不爽
封装之后
let yy = (function () {
let a = 10
let b = 20
function add() {
return a + b
}
function acc() {
return a - b
}
//return出去 yy就有了这两个方法了
return{
add,
acc
}
})()
let result1 = yy.add()
let result2 = yy.acc()
console.log(result1);
console.log(result2);
封装起来 调用时 我只用了yy这一个变量实现了 两个功能
简单方便