当面试官问你闭包时,他究竟想听到些什么?

“请你讲一下闭包”——这道题几乎是前端面试必问的问题,今天我试着总结一下如何优雅的回答这道题

闭包是什么?

闭包是有权限访问其他函数作用域内的变量的一个函数。

这是《JavaScript高级程序设计》中给出的定义,如果你想就用这一句话就把面试官搞定几乎是不可能的。

因为这句话还存在下面几个深入的问题:

■为什么其他非闭包的函数没有权限访问另一个函数的内部作用域

■为什么闭包有这个权限

■什么是函数作用域

面试官更想知道的是你是否知道上面的内容。

那好一个更周全的解释方法应运而生:

由于在JS中,变量的作用域属于函数作用域,在函数执行后作用域就会被清理、内存也随之回收,但是由于闭包是建立在一个函数内部的子函数,由于其可访问上级作用域的原因,即使上级函数执行完,作用域也不会随之销毁,这时的子函数——也就是闭包,便拥有了访问上级作用域中的变量的权限,即使上级函数执行完后作用域内的值也不会被销毁。

稍微有些啰嗦,但是一分钟以内应该足够了(如果流利的话)。这样一来,面试官基本上了解了你对于上面三个知识点是掌握的。

闭包解决了什么?

请放心,就凭上面那段话,面试官是不会善摆干休的。他一定会继续追问,一般来说会问——闭包解决了什么问题。

阮一峰在他的博客——《学习Javascript闭包(Closure)》中写到:在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

阮一峰写的太文艺了,我想务实点的说法应该是下面这样:

由于闭包可以缓存上级作用域,那么就使得函数外部打破了“函数作用域”的束缚,可以访问函数内部的变量。以平时使用的Ajax成功回调为例,这里其实就是个闭包,由于上述的特性,回调就拥有了整个上级作用域的访问和操作能力,提高了极大的便利。开发者不用去写钩子函数来操作上级函数作用域内部的变量了。

闭包有哪些应用场景

这个问题也极有可能被追问。

我的回答会是下面的样子:

闭包随处可见,一个Ajax请求的成功回调,一个事件绑定的回调方法,一个setTimeout的延时回调,或者一个函数内部返回另一个匿名函数,这些都是闭包。简而言之,无论使用何种方式对函数类型的值进行传递,当函数在别处被调用时都有闭包的身影。

闭包有哪些

原理比较深奥:要想完全掌握闭包,一定要清楚函数作用域、内存回收机制、作用域继承等,然而闭包是随处可见的,很可能开发者在不经意间就写出了一个闭包,理解不够深入的话很可能造成运行结果与预期不符。

代码难以维护:闭包内部是可以缓存上级作用域,而如果闭包又是异步执行的话,一定要清楚上级作用域都发生了什么,而这样就需要对代码的运行逻辑和JS运行机制相当了解才能弄明白究竟发生了什么。

闭包

闭包是JavaScript这门语言中非常重要但又难以掌握的概念。如果掌握了闭包并运用自如的话,会让你“功力大增”

参考:

《JavaScript高级程序设计》

《你不知道的JavaScript》

阮一峰的网络日志《学习Javascript闭包(Closure)》

原文发布于微信公众号 - 较真的前端(gh_7af41a2be77e)

原文发表时间:2017-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java大联盟

Java面试手册:核心基础-1

4.替换原则 :里氏替换原则(Liskov Substiution Principle, LSP)定义以及主要思想:子类型必须能够替换掉它们的父类型、并出现在父...

1874
来自专栏WeaponZhi

AI 学习之路——轻松初探 Python 篇(二)

这是「AI 学习之路」的第 2 篇,「Python 学习」的第 2 篇 我将分两篇讲解下 Python 的基础语法,这是第一篇。大家也可以在很多地方看到入门的学...

40012
来自专栏前端架构与工程

【翻译】ES6生成器简介

原文地址:http://davidwalsh.name/es6-generators ES6生成器全部文章: The Basics Of ES6 Generat...

2007
来自专栏小樱的经验随笔

Uva 11729 Commando War (简单贪心)

Uva 11729  Commando War (简单贪心) There is a war and it doesn't look very promising...

2696
来自专栏企鹅号快讯

verilog编程要素整理时刻牢记

verilog编程建议 1、不使用初始化语句; 2、不使用延时语句; 3、不使用循环次数不确定的语句,如:forever,while等; 4、尽量采用同步方式设...

1948
来自专栏技术之路

c++基础 使用智能指针

三个智能指针模板(auto_ptr、unique_ptr和shard_ptr)都定义了类似指针的对象(c++11已将auto_ptr摒弃),可以将new获得(直...

1995
来自专栏信数据得永生

JavaScript 编程精解 中文第三版 二、程序结构

41515
来自专栏黑泽君的专栏

java基础学习_IO流03_字符流、IO流小结、案例_day21总结

892
来自专栏web前端教室

网易云课堂公开课-Promise【文字版】

今天的网易云课堂的公开课已经结束,因为是第一次,所以有些操作也不太熟练,下面是本次公开课的文字内容。

1432
来自专栏智能算法

Python学习(一)---- Python基础必备

https://blog.csdn.net/fgf00/article/details/52061971

4944

扫码关注云+社区

领取腾讯云代金券