一、自由变量
在学习闭包之前,首先了解一下什么是自由变量:
一个变量在当前作用域(比如函数内)没有定义,但是被使用了,这个变量就是自由变量。在定义该函数的位置,向上级作用域,一层一层依次寻找,直到找到为止。如果全局作用域都没有找到,则报错 xx is not defined 。
二、闭包
什么是闭包?
简单来说,闭包是一个函数,它不仅包含了函数自身的代码,还包含了函数定义时所在的环境中的变量引用。
闭包的应用场景有哪些?
① 函数作为参数被传递;
② 函数作为返回值被返回。
学习闭包,必须弄懂以下两段代码!!!
// 函数作为返回值
function create(){
let a = 100;
return function(){
console.log(a);
}
}
let fn = create();
let a = 200;
fn()
// 以上代码运行的结果为:输出100
// 函数作为参数
function print(fn){
let a = 200;
fn();
}
let a = 100;
function fn(){
console.log(a);
}
print(fn);
// 以上代码运行的结果为:输出100
以上代码运行原理:
首先要知道,console.log(a)中的变量a是自由变量,因为在fn函数中并没有定义变量a。
原理:所有的自由变量的查找,是在函数定义的地方向上级作用域查找,不是在执行的地方!