Heim  >  Artikel  >  Backend-Entwicklung  >  为何前端面试官都喜欢问闭包?

为何前端面试官都喜欢问闭包?

WBOY
WBOYOriginal
2016-06-06 16:23:131075Durchsuche

很多公司前端开发职位相关的面试官都喜欢问闭包。能否理解闭包可以当作评判一个前端开发的依据?

回复内容:

大致是这样:

1,面试题以半开放问题为佳。闭包就是个半开放问题。所谓半开放,就是说你可以就你知道的随便说,但是大致上有一些点面试官可以守着,看看你说的是否全面、准确。

2,这个问题可以追问。根据你的回答情况,面试官可以补充若干递进问题。比如作用域,变量提升,引用传递,异常捕获等等,涉及到的点还是比较多的。而且能追问不是显得比较有面子嘛是吧?

3,这个问题是普适的。一方面它确实是个基础问题,入口点完全是初级的,就算你经验很少,也不应该一句答不出来。另一方面,它和平台的相关性比较小,也基本不随着业界格局变化,较为稳定。像内存泄露他就不太好问,你来一句“这个话题过时了”咋整?

4,就 js 语言本身,它不像 C++ 一样有着灿若繁星的特性。实际上真正适合面试的,可选择的问题并不多,面试官也未必就有能力出更好的题目。而且 js 不像 java,在语言之上建立了层层公认的业务框架,js 连个标准库都没有。你面 java,问个 struts,spring,hadoop 什么的,天经地义啊,可是面试官面 js 的时候,除了 jquery,还有什么库能安全提问呢?你问个 react,人家说没用过,也天经地义啊。

5,最终形成的局面就是,“请解释一下闭包”,“请问如何实现面向对象”,“请解释一下this关键字”…… 什么是闭包,回答多种多样,对 JavaScript 理解层次的不同会有不一样的答案。
有次面试官问我什么是闭包,我按照我的理解回答了,他却要我写出一个闭包来…一个函数里返回一个函数…然后他满意了…这种水平我基本是不会去的。 前端不懂闭包也能将就用各种框架开发,前端门槛本来就低,各种轮子也把很多工作傻瓜化了。

闭包能把只会用轮子的人筛下去。

作用域是JS里不多的需要理解的东西,其他的框架,函数,API什么的就是个查文档的事。

闭包说白了是个函数作用域的问题,作用域-引申到垃圾回收-循环依赖-内存泄漏-dom对象和JS对象的不同-this作用域-再到原型链-面向对象-甚至再到js引擎-浏览器内核。

能以闭包为切入点,把JS要的理解点,问个遍。

如果是一个多语言开发者,能引申更多的东西,比如不同语言的各种回收算法,循环依赖,强弱引用,其他静态语言支持闭包的也不少,部分静态语言编译器级的闭包实现。

闭包是很简单,不为考技术,更为能检验一个人是不是真的对JS这种语言有兴趣,是不是有求知欲和好奇心,是不是有基本的学习能力和理解能力,这些都是一个开发人员该有的基本素质。

能力经验到了一定阶段,都不是为了面技术,更是为了了解对开发工作的态度,学习理解的深度和沟通的感觉。

个人是先学静态语言如c,java,后来接触的JS,最开始实在难以理解JS的函数作用,其实没有一点静态语言基础的反而更好理解。

终于搞明白的那一刻,深吸了口气,那感觉真爽。 我面试人从来不问闭包。

因为我认为闭包太简单了,没啥好问的。


更新,答 @niko :

问任何这类问题,总可以考察一些方面。但是面试的效率决定了你需要不断找到更好的问题。怎么样是更好的问题,参见 @winter 的谈谈面试与面试题 · Issue #4 · wintercn/blog · GitHub 拿区分度、深度、覆盖率来考察下“如何理解闭包”这个问题,跟其他问题比是不太理想的。 路过
随便说几句
可能这几个因素
1、因为普遍具有实际用途
2、有着相对的有比较明确的答案
3、具有普遍认知度的问题,除了这几个真是没啥可问的

比如偶几年前校招时候浏览器问过
元素的内联事件处理函数的查找顺序
就是

这个 a 函数是怎么被浏览器找到的
是否所有实现查找都一致

没人能答对啊
就连问题都得说几次才能明白
说白了就是问的偏了
还不如问闭包来的直接呢

知道闭包的再问问使用场景
差不多能确定普通搬搬砖
不会给惹大麻烦什么的了吧 你都知道会问 还不会 就有点奇怪了。

我一般都问 for 100个按钮 bind click 怎么log对index。 然而对于闭包最准确的描述应该是 @niko 答案里面的一条:闭包就是一个函数内部可以访问函数外部的现象表述。

可以做下:Learning Advanced JavaScript 这几个例子,深入理解下。

至于那些 onclick 或者 setTimeout 的例子,简直有些误导,那些例子之所以能 OK 更多的是因为立即执行函数创建了一个个小作用域,将 i 传递到函数里面的小作用域中,当调用起 onclick 的函数之后,会在小作用域里面搜索。还有一个点就是往函数传参的时候,是传值的,而不是传地址的。这个例子基本没有表现出什么闭包的特性,反而让一些「新手」非常直观的认为:闭包就是包裹一层立即执行函数。

建议 @刘洋 思考一下在 @小爝 评论里的 demo Edit fiddle - JSFiddle,去掉 arr[i].index 这行,在 onclick 里面直接打印 i 为什么不行?因为你的立即执行函数创建的作用域里面,还是没有 i 这个变量,结果 onclick 执行往上层作用域寻找 i 的时候,此时 i 为 10。 看你面试的是什么人吧。
就像贺老 @贺师俊说的,他从不面闭包,因为闭包太简单,也因为他不需要那个level的工程师吧。
我也不问,不过和贺老不一样,我不问是因为不会(划掉)因为这个问题问烂了,简直是必背面试题之一了。而且你知道怎么说和真的了解在哪用怎么用的更好,并没有什么关系。
要说基础,比这个基础的东西多得多~ 其实吧。有些看似很傻的问题只是用来甄别要不要再问更深的问题的步骤。
好比那些背单词的软件,总要从易到难的。

一般都是从简单的如padding, margin区别(CSS), alt和title的区别呀(html), ==和===的区别呀(js)
这样开始的。闭包只是再向上一点点的台阶。

好比,你写了说你精通css3,然后不知道padding, margin的区别。我们还需要继续下去吗?
一般问三个简单的,你都不知道,从统计学上,是吹牛的误判的概率就很小了。

所以不知道闭包,或者知道不够清楚并没有关系。如果很多同级别的问题都不知道,就可以判断你的知识的上限在哪里了。 其实闭包是可以做为评判依据之一,但是我不会主动问。
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn