第二章:课堂风波,闭包初体验

95 阅读5分钟

第二章:课堂风波,闭包初体验

第二天一早,苏澈在闹钟还没响之前就醒了。为了巩固所学的 JavaScript 知识,他把笔记本掀开,认真记下了昨晚复习的要点:作用域、闭包、原型链……

“要想打造一个先进的框架,这些底层知识一定不能马虎。”

大约七点多,赵大海才磨蹭着起床,眼睛还没完全睁开,就听见苏澈在那儿敲键盘。

“澈子,你不会真的打算一直学吧?我们可是宅男宿舍啊,平时通宵打游戏,偶尔逃课……你可别出卖兄弟们的节奏啊。”

苏澈随手在代码编辑器里敲下一段 JavaScript 代码,笑而不语。

“你先去洗漱吧,待会儿有课,我要去听。”

“行行行,你爱去就去,反正我对课本没啥兴趣。要不是上学期挂科了,我才懒得听李教授的课。”赵大海嘟囔着。“不过话说回来,李教授虽然严厉,但他对编程还是有两把刷子的。”

半小时后,教学楼

教室里人并不算多,这门名为“Web前端基础”的课程,在2014年并不热门,大多数同学还停留在“前端=切图+简单脚本”的印象里,导致选课的人并不多。

苏澈找了个前排位置坐下,环顾四周,发现林雨菲居然也在这里。她正低头看着一叠复习资料,神情专注。

“雨菲也选了这门课?”

苏澈记得,她平时对编程颇有兴趣,但大部分时间都在自学算法和数据结构。或许这一次,她是想补足前端短板吧。

正想着,林雨菲似有所感,抬头与苏澈四目相对。

“苏澈?你居然来了?”她微微惊讶。

“怎么,不欢迎?”

“不是,只是……”林雨菲似乎犹豫了一下,最后还是忍不住笑了,“你平时不是很少来上课吗?”

苏澈讪讪地摸了摸鼻子:“咳,这不打算认真学习了嘛。”

就在两人对话之际,李教授抱着一叠讲义走了进来。李教授年逾半百,但精神矍铄,穿着一身略显老旧的西装,看上去有点老派。

“同学们,今天这节课,我们来讲讲 JavaScript 中的作用域与闭包。”

听到这个主题,苏澈立刻精神一振,挺直了腰板。

李教授一边打开投影,一边继续说道:“很多同学认为 JavaScript 只是做点简单交互就够了,实际上,若想深入理解 JavaScript,便必须弄清楚‘作用域’和‘闭包’的机制。”

苏澈暗暗点头:“这老头说得没错。”

PPT 上出现了一些代码示例:

function foo() {
  var a = 10;
  function bar() {
    console.log(a);
  }
  return bar;
}


var baz = foo();
baz(); // 输出 10

李教授转过身,扫视了一圈:“谁能告诉我,为什么 baz 调用时还能访问到 foo 作用域里的变量 a?”

台下鸦雀无声。大多数同学对此一头雾水。只有林雨菲轻咬嘴唇,似乎在思考,但又没举手。

李教授皱了皱眉:“连这个都没人知道?”

正当他准备继续讲解时,苏澈举起手来:“老师,可以让我尝试回答一下吗?”

李教授的目光落在苏澈身上,微微露出惊讶:“哦?你就是那位……咳,来吧,你说说看。”

显然,李教授对苏澈“平时不爱上课”的名声也有所耳闻。

“我觉得,这个现象的根源在于 JavaScript 的词法作用域,函数 bar 在定义的时候,就已经确定了能访问 foo 作用域里的变量 a。当我们把 bar 函数返回并赋值给 baz 后,bar 依然保有对 foo 作用域的引用,也就是我们所说的闭包。”

李教授眼睛一亮:“不错,你继续。”

“闭包就像一个内部私密空间,里面存放着函数定义时所依赖的环境状态,也可以理解成‘函数 + 环境’的组合。虽然 foo 已经执行完毕,但由于 bar 依然引用了 a,所以 a 不会被回收。”

台下一片哗然,许多同学都露出了好奇的目光。林雨菲眼中闪过一丝赞赏,也有些惊讶:这家伙什么时候变得这么会讲了?

李教授点点头,意味深长地看了苏澈一眼:“很少见你上课,不过看来你确实花了功夫。”

他转向黑板,继续补充:“刚才这位同学解释得很好。JavaScript 的作用域是词法作用域,也就是在代码定义时决定的,而闭包则是因为内部函数依旧持有对外部函数作用域的引用,从而实现了对变量的延续访问。”

课后的提问环节,林雨菲主动走到苏澈身边:“你今天的回答……让我刮目相看啊。”

苏澈嘿嘿一笑:“只是临时抱佛脚。”

赵大海从后排挤过来,一副崇拜的表情:“澈子,你这波太秀了吧?闭包我可是一知半解,还以为就是函数套函数这么简单。”

苏澈见状,心中暗乐:这只是开始,等把更多原理讲给你们听,看你还能不能淡定。

临走前,李教授拍了拍苏澈的肩膀:“下次再来上课,别落下功课。嗯,我对你有点新期待。”

看着李教授远去的背影,苏澈暗暗攥紧拳头:“前端这条路上,还有很多东西要学。Vue 只是个想法,需要的可是扎实的底层功夫。”

他知道,自己才刚刚开始。