昨天本菜鸟兴高采烈地以外包身份去百度进行面试,虽然预料到会被虐的体无完肤,但还是一被面到腿软,以至于一二面的技术都问了些什么问题,哪些感觉没答好都忘记了。回到家静坐半个小时,全然没有想起多少来,直到今天早上的灵光乍现。这个系列,随缘更新,不是那种陈列面试问题和答案的考试复习题,而是主要将本人经历过的一些觉得值得写一篇文章的面试问题,以及对他的思考分享出来。
更新:现在突然想到面试官的意思可能是想说为什么没有写这个自定义的定时器的清除方法。。。。。。可能就是这样吧,对,一定是这样。只有这样才会涉及到闭包嘛。。。。
——————————————————————————————————————
首先说下当时的面试原题,是需要用setTImeout实现一个定时器(烂大街的面试题......)。
提笔就写:
function fn(f, time){
f&&f();
setTimeout(()=>{
fn(f,time);
},time)
fn(()=>{
console.log(1);
},300)复制代码
自信满满交上答卷,换来面试官的一声疑问,“你这个有问题呀,你怎么不清除这个延时器呀,这每次递归都生成了一个延时器呀?”看着一脸茫然的我,还补了一句,是不是没用过clearTimeout.....
当时内心即懵逼又想解释,setTimeout执行完了还需要清除?我的世界观里clear小伙子的唯一作用就是将延时器的计划扼杀在萌芽中的。抛出疑问后,面试官回了一句:“要的要的,回去自己百度下(这广告打得,行云流水般顺畅)。”后来回到家,我查了一下网上对于setTimeout执行完毕后会不会自动销毁的回答,发现从14年到今天为止,说啥的都有。介于clearTimeout对不存在的延时器的id,执行完后都不会报错也不报警,所以我到目前为止,也站不准哪一派言论是对的。大佬们有查看网页中存在的定时器的方法经验的一定要分享下,本鸟在这里先谢过了。
setTimeout的问题其实可以分为两类,有限次调用和无限次调用(或是递归)。对于实际使用的解决方案的话,这里找到一个对我比较有说服力的说法。
setTimeout每次都是重新生成一个延时器的,所以首先不存在什么递归函数执行环境不会回收而产生闭包的说法,其次恕我实在看不出哪儿会有因为延时器而导致的内存得不到释放的情况,有其他想法的请在下面帮我解释下......有的同学说是因为有个timer一直有值得不到释放,每一次的递归函数走完,timer有没出去撩骚,为啥得不到释放?(又不是人......咳咳。。。)所以我暂时站在不用clear的一方。
唉~写完感觉又水了一篇文章,一上午查资料,问大佬总结一下就是,脑子抽了要用延时器实现定时器。。。最后贴两张图,看会儿鸡条补补脑子去。
两个都是60ms空逻辑的固定条件