持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
铃铛说点题外话
一句话前情回顾:确定的输入一定产生确定的输出,执行过程不产生副作用的函数是纯函数。
一句话介绍今天:闭包
今天就要把箭头函数打下来
铃铛说正文
跟铃铛说再见
闭包
在说闭包之前我们需要明白作用域链的概念,其实很简单,在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恰恰引用了window、f1和f2的作用域。因此f2可以访问到f1的作用域的变量。
学习的最后一步:放松
今日冷笑话:有一天绿豆自杀从5楼跳下来,流了很多血,变成了红豆;一直流脓,又变成了黄豆;伤口结了疤,最后成了黑豆。
放松结束,猜猜明天会说讲些什么吧