JavaScript学习笔记—闭包
1. 定义
闭包就是能访问到外部函数作用域中变量的函数
2. 什么时候使用
当需要隐藏一些不希望被别人访问的内容时就可以使用闭包
3. 构成要件
(1)函数的嵌套
(2)内部函数要引用外部函数中的变量
(3)内部函数要作为返回值返回
function outer(){
let num = 0;
return () => {
num++;
console.log(num);
}
}
const newFn = outer();
newFn(); // 1
newFn(); // 2
newFn(); // 3
4. 原理
闭包利用的就是词法作用域
let a = "全局变量a";
/*
函数作用域,在函数创建时就已经确定(又称词法作用域)
和调用的位置无关
*/
function fn() {
console.log(a);
}
function fn2() {
let a = "fn2中的变量a";
fn();
}
fn2(); // 全局变量a
function fn3() {
let a = "fn3中的变量a";
function fn4() {
console.log(a);
}
fn4();
}
fn3(); // fn3中的变量a
5. 一些注意问题
- 闭包的声明周期
(1)闭包在外部函数调用时产生,外部函数每次调用都会产生一个全新的闭包
(2)在内部函数丢失时销毁(内部函数被垃圾回收了,闭包才会消失) - 注意事项
闭包主要用来隐藏一些不希望被外部访问的内容,这就意味着闭包需要占用一定的内存空间
相较于类来说,闭包比较浪费内存空间(类可以使用原型而闭包不能)
需要执行次数较少时,才使用闭包;需要大量创建实例,实用类
function outer() {
let someVariable = "someValue";
return function(){ // 匿名函数返回
console.log(someVariable);
}
}
// 调用函数,产生闭包
outer();
function outer2() {
let num = 0;
return () => {
num++;
console.log(num);
}
}
let fn1 = outer2(); // 独立闭包
let fn2 = outer2(); // 独立闭包
fn1(); // 1
fn2(); // 1
// 函数被回收,闭包销毁
fn1 = null;
fn2 = null;