2017-02-26
面试
JS
一道闭包相关的面试题
我提炼了原文… 原文链接: Excuse me?这个前端面试在搞事!
作者: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

(侵删 完)




回到顶部