美文网首页
一个闭包笔试题

一个闭包笔试题

作者: 爱楚楚真是太好了 | 来源:发表于2019-06-17 16:46 被阅读0次

预备知识:
使用setTimeout会生成一种特殊的队列结构,而这个队列执行的时间,需要等待到函数调用栈清空之后才开始执行。即所有可执行代码执行完毕之后,才会开始执行由setTimeout定义的操作。而这些操作进入队列的顺序,则由设定的延迟时间来决定。

利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5

for (var i=1; i<=5; i++) { 
    setTimeout( function timer() {
        console.log(i);
    }, i*1000 );
}

根据setTimeout定义的操作在函数调用栈清空之后才会执行的特点,for循环里定义了5个setTimeout操作。而当这些操作开始执行时,for循环的i值,已经先一步变成了6。因此输出结果总为6。而我们想要让输出结果依次执行,我们就必须借助闭包的特性,每次循环时,将i值保存在一个闭包中,当setTimeout中定义的操作执行时,则访问对应闭包保存的i值即可。
解法1:

for (var i=1; i<=5; i++) { 
    setTimeout( (function(i) {
        return function() {
            console.log(i);
        }
    })(i), i*1000 );
}

解法2:

for (var i=1; i<=5; i++) { 
 
    (function(i) {
        setTimeout( function timer() {
            console.log(i);
        }, i*1000 );
    })(i)
}

解法3:

for (let i=1; i<=5; i++) { 
    setTimeout( (function(i) {
        return function() {
            console.log(i);
        }
    })(i), i*1000 );
}

巩固列子:

setTimeout(function() {
    console.log(a);
}, 0);
 
var a = 10;
 
console.log(b);
console.log(fn);
 
var b = 20;
 
function fn() {
    setTimeout(function() {
        console.log('setTImeout 10ms.');
    }, 10);
}
 
fn.toString = function() {
    return 30;
}
 
console.log(fn);
 
setTimeout(function() {
    console.log('setTimeout 20ms.');
}, 20);
 
fn();
599584-bc54089aededce6f.png

先执行完除setTimeout以外的所有可执行代码,然后在根据setTimeout设置的延时时间去决定执行顺序,这里需要注意的是,当执行fn()时,发现新增一个setTimeout,然后再根据延迟时间来决定执行顺序。

摘自:https://www.jianshu.com/p/9b4a54a98660

相关文章

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • 关于闭包 vue3 防抖 节流

    闭包好像成了面试题必考,干脆就学一下。我暂时理解的闭包:一个函数中嵌套着另一个函数,这个函数就是闭包。闭包不会内存...

  • 【JS】总算能把闭包经典面试题真的讲清楚了

    闭包的经典面试题 说到闭包,那么这个经典的闭包面试题,大家肯定都很熟悉: 这个例子当中为什么i输出的都是5呢?能够...

  • 一道js闭包面试题的学习

    最近看到一条有意思的闭包面试题,但是看到原文的解析,我自己觉得有点迷糊,所以自己重新做一下这条题目。 闭包面试题原...

  • 一个闭包笔试题

    预备知识:使用setTimeout会生成一种特殊的队列结构,而这个队列执行的时间,需要等待到函数调用栈清空之后才开...

  • 一个关于闭包很小的面试题

    关于闭包一个很小的面试题。 01 背景 在很久以前,面试中问起闭包应用场景的是,如果页面上有 N 个按钮要绑定点击...

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • 关于JS闭包(JS闭包系列1)

    今天做笔试题,好多关于JS闭包问题,就整理出来,分享一下。 首先,引用下所谓的“官方解释”:所谓“闭包”,指的是一...

网友评论

      本文标题:一个闭包笔试题

      本文链接:https://www.haomeiwen.com/subject/lvxzfctx.html