我提炼了原文… 原文链接: Excuse me?这个前端面试在搞事!
作者:Liril
链接:https://zhuanlan.zhihu.com/p/25407758
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Liril
链接:https://zhuanlan.zhihu.com/p/25407758
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
# JavaScript Closure ↵
# 01
00for (var i = 0; i < 5; i++) { 01 console.log(i); 02}
“应该是直接输出 0 到 4 吧…”
# 02
“那么这样呢?”
00for (var i = 0; i < 5; i++) { 01 setTimeout(function() { 02 console.log(i); 03 }, 1000 * i); 04}
“应该是开始输出一个 5,然后每隔一秒再输出一个 5,一共 5 个 5。”
“对,那应该怎么改才能输出 0 到 4 呢?”
00for (var i = 0; i < 5; i++) { 01 (function(i) { 02 setTimeout(function() { 03 console.log(i); 04 }, i * 1000); 05 })(i); 06}
“很好,那你能说一下,我删掉这个 i 会发生什么吗?”
00for (var i = 0; i < 5; i++) { 01 (function() { 02 setTimeout(function() { 03 console.log(i); 04 }, i * 1000); 05 })(i); 06}
“这样子的话,内部其实没有对 i 保持引用,其实会变成输出 5。”
# 03
“很好,那我给你改一下,你看看会输出什么?”
00for (var i = 0; i < 5; i++) { 01 setTimeout((function(i) { 02 console.log(i); 03 })(i), i * 1000); 04}
“应该是立马输出 0 到 4 吧。”
# 04
“哎哟,不错哦,最后一题,你对 Promise 了解吧?”
“还可以吧…”
“OK,那你试试这道题。”
00setTimeout(function() { 01 console.log(1) 02}, 0); 03new Promise(function executor(resolve) { 04 console.log(2); 05 for( var i=0 ; i<10000 ; i++ ) { 06 i == 9999 && resolve(); 07 } 08 console.log(3); 09}).then(function() { 10 console.log(4); 11}); 12console.log(5);
“2 3 5 4 1”
“好滴,等待下一轮面试吧。”
# 有趣 ↵
从很简单的循环入手,然后谈到闭包,也穿插着作用域。 最后还谈了谈 Promise …
水平确实高
# Links ↵
(侵删 完)