一道考察js闭包的面试题目
下面这道js面试题目,主要考察对闭包概念的理解,用了好几年,在一面中能完全答对的面试者寥寥。这几天恰巧又在面试,想起这道题目,贴出来分析一下。
var a = 0, b = 0;
function A(a) {
A = function B(b) {
alert(a+b++);
}
alert(a++);
}
A(1);
A(2);
把代码粘到浏览器控制台执行,很容易得出输出结果是1和4。
首先,这段代码只有两次输出,说明每次调用函数A
,只执行了一次alert
。很多同学会认为有四次输出,这里涉及的考点是函数声明和命名函数表达式。第3行的赋值语句,使用函数表达式更新了函数A
为函数B
,于是第二次调用函数A
,实际执行的是函数B
中的代码,所以每次调用只有一个alert
执行。
其次是本道题目的重点,闭包变量a
。第一次调用函数A
,第6行的alert
输出1,参数a
在函数执行结束后的值是2,而这个a
此时作为闭包变量留在了命名函数表达式中。第二次调用函数A
,传入的2实际对应函数B
的参数b
,而此时函数B
中的变量a
的值也是2,于是第4行的alert
执行,输出4。
最后,考察对i++
和++i
的理解,还有一元运算符与二元运算符的运算顺序,这里就不细说了。