为何前端面试官都喜欢问闭包?
程序员文章站
2022-05-23 11:26:54
...
很多公司前端开发职位相关的面试官都喜欢问闭包。能否理解闭包可以当作评判一个前端开发的依据?
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的区别。我们还需要继续下去吗?
一般问三个简单的,你都不知道,从统计学上,是吹牛的误判的概率就很小了。
所以不知道闭包,或者知道不够清楚并没有关系。如果很多同级别的问题都不知道,就可以判断你的知识的上限在哪里了。 其实闭包是可以做为评判依据之一,但是我不会主动问。
回复内容:
大致是这样: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的区别。我们还需要继续下去吗?
一般问三个简单的,你都不知道,从统计学上,是吹牛的误判的概率就很小了。
所以不知道闭包,或者知道不够清楚并没有关系。如果很多同级别的问题都不知道,就可以判断你的知识的上限在哪里了。 其实闭包是可以做为评判依据之一,但是我不会主动问。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频