只要你对 JS 中同步和异步代码的差别、变量感化域、闭包等概念有精确的懂得,就知道精确谜底是 C,代码的实际输出是:
写在前面,笔者在做面试官这 2 年多的时光内,面试了数百个前端工程师,惊奇的发明,跨越 80% 的候选人对下面这道题的答复情况联结格都达不到。这毕竟是如何神奇的一道面试题?他考察了候选人的哪些才能?对正在读本文的你有什么启发?且听我慢慢道来
不起眼的开端
雇用前端工程师,尤其是中高等前端工程师,扎实的 JS 基本绝对是须要前提,基本不扎实的工程师在面对前端开辟中的各类问题时大年夜概率会束手无策。在考察候选人 JS 基本的时刻,我经常会供给下面这段代码,然后让候选人分析它实际运行的结不雅:
- for (var i = 0; i < 5; i++) {
- setTimeout(function() {
- console.log(new Date, i);
- }, 1000);
- }
- console.log(new Date, i);
细心的同窗会发明,这里只有个异常细微的更改,即应用 ES6 块级感化域(Block Scope)中的 let 替代了 var,然则代码在实际运行时会报错,因为最后那个输出应用的 i 在其地点的感化域中并不存在,i 只存在于轮回内部。
这段代码很短,只有 7 行,我想,能读到这里的同窗应当不须要我逐行解释这段代码在做什么吧。候选人面对这段代码时给出的结不雅也不尽雷同,以下是典范的谜底:
- A. 20% 的人会快速扫描代码,然后给出结不雅:0,1,2,3,4,5;
- B. 30% 的人会拿着代码逐行看,然后给出结不雅:5,0,1,2,3,4;
- C. 50% 的人会拿着代码细心揣摩,然后给出结不雅:5,5,5,5,5,5;
- 2017-03-18T00:43:45.873Z 5
- 2017-03-18T00:43:46.866Z 5
- 2017-03-18T00:43:46.868Z 5
- 2017-03-18T00:43:46.868Z 5
- 2017-03-18T00:43:46.868Z 5
- 2017-03-18T00:43:46.868Z 5
接下来我会追问:如不雅我们商定,用箭头表示其前后的两次输出之间有 1 秒的时光距离,而逗号表示其前后的两次输出之间的时光距离可以忽视,代码实际运行的结不雅该若何描述?会有下面两种谜底:
- A. 60% 的人会描述为:5 -> 5 -> 5 -> 5 -> 5,即每个 5 之间都有 1 秒的时光距离;
- B. 40% 的人会描述为:5 -> 5,5,5,5,5,即第 1 个 5 直接输出,1 秒之后,输出 5 个 5;
这就请求候选人对 JS 中的准时器工作机制异常熟悉,轮回履行过程中,几乎同时设置了 5 个准时器,一般情况下,这些准时器都邑在 1 秒之后触发,而轮回完的输出是急速履行的,显而易见,精确的描述是 B。
下面是笔者给出的参考代码:
追问 1:闭包
如不雅这道题仅仅是考察候选人对 JS 异步代码、变量感化域的懂得,局限性不免难免太大年夜,接下来我会追问,如不雅期望代码的输出变成:5 -> 0,1,2,3,4,该怎么改革代码?熟悉闭包的同窗很快能给出下面的解决办法:
- for (var i = 0; i < 5; i++) {
- (function(j) { // j = i
- setTimeout(function() {
- console.log(new Date, j);
- }, 1000);
- })(i);
推荐阅读
$ mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount \ -Dexec.args="--runner=SparkRunner --inputFile=pom.xml --output=counts" -Pspark-runner 1.概述在大>>>详细阅读
本文标题:80%应聘者都不及格的JS面试题
地址:http://www.17bianji.com/lsqh/34710.html
1/2 1