细说JS系列(十六)—闭包

54 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

铃铛说点题外话

一句话前情回顾:确定的输入一定产生确定的输出,执行过程不产生副作用的函数是纯函数。

一句话介绍今天:闭包

今天就要把箭头函数打下来

铃铛说正文

image.png

跟铃铛说再见

闭包

在说闭包之前我们需要明白作用域链的概念,其实很简单,在ES5中只存在两种作用域全局作用域函数作用域,当访问一个变量的时候,解析器会首先在当前作用域查找标识符,如果没有找到就回去它的父级作用域查找,直到找到全局作用域Object中还是没有找到会返回undefined,这就是一条作用域链,值得注意的是,每一个函数都会拷贝上级的作用域,形成一个作用域的链条。

var a = 1;
function f1() {
  var a = 2
  function f2() {
    var a = 3;
    console.log(a);//3
  }
}

在上面这段代码中,f1的作用域指向有全局作用域(window)和它本身,而f2的作用域指向全局作用域(window)、f1和它本身。而且作用域是从最底层向上找,直到找到全局作用域window为止,如果全局还没有的话就会报错。

那么,闭包的本质就是,当前环境中存在指向父级作用域的引用

function f1() {
  var a = 2
  function f2() {
    console.log(a);//2
  }
  return f2;
}
var x = f1();
x();

这里x会拿到父级作用域中的变量,输出2。因为在当前环境中,含有对f2的引用,f2恰恰引用了windowf1f2的作用域。因此f2可以访问到f1的作用域的变量。

学习的最后一步:放松

今日冷笑话:有一天绿豆自杀从5楼跳下来,流了很多血,变成了红豆;一直流脓,又变成了黄豆;伤口结了疤,最后成了黑豆。

放松结束,猜猜明天会说讲些什么吧