奇妙的应用 IIFE(Immediately Invoked Function Expression:声明即履行的函数表达式)来解决闭包造成的问题,确切是不错的思路,然则初学者可能并不认为如许的代码很好懂,至少笔者初入门的时刻这里揣摩了一会儿才真正懂得。
有没有更相符直觉的做法?谜底是有,我们只须要对轮回体稍做四肢举动,让负责输出的那段代码能拿到每次轮回的 i 值即可。该怎么做呢?应用 JS 中根本类型(Primitive Type)的参数传递是按值传递(Pass by Value)的特点,不难改革出下面的代码:
- var output = function (i) {
- setTimeout(function() {
- console.log(new Date, i);
- }, 1000);
- };
- for (var i = 0; i < 5; i++) {
- output(i); // 这里传以前的 i 值被复制了
- }
- console.log(new Date, i);
能给出上述 2 种解决筹划的候选人可以认为对 JS 基本的懂得和应用是不错的,可以各加 10 分。当然实际面试中还有候选人给出如下的代码:
- for (let i = 0; i < 5; i++) {
- setTimeout(function() {
- console.log(new Date, i);
- }, 1000);
- }
- console.log(new Date, i);
如不雅到这里算是合格的话,100 小我参加面试只有 20 人能合格,读到这里的同窗可以细心思虑,你合格了么?
能想到 ES6 特点的同窗固然没有答对,然则展示了本身对 ES6 的懂得,可以加 5 分,持续进行下面的追问。
总结
追问 2:ES6
有经验的前端同窗读到这里可能有些不耐烦了棘扯了这么多,都是他知道的内容,先别焦急,挑衅的难度会持续增长。
接着上文持续追问:如不雅期望代码的输出变成 0 -> 1 -> 2 -> 3 -> 4 -> 5,并且请求原有的代码块中的轮回和两处 console.log 不变,该怎么改革代码?新的需求可以精确的描述为:代码履行时,急速输出 0,之后每隔 1 秒依次输出 1,2,3,4,轮回停止后在大年夜概第 5 秒的时刻输出 5(这里应用大年夜概,是为了避免钻牛角尖的同窗陷进去,因为 JS 中的准时器触发机会有可能是不肯定的,具体可拜见 How Javascript Timers Work)。
看到这里,部分同窗会给出下面的可行解:
- for (var i = 0; i < 5; i++) {
- (function(j) {
- setTimeout(function() {
- console.log(new Date, j);
推荐阅读
$ 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