下面这道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的理解,还有一元运算符与二元运算符的运算顺序,这里就不细说了。

标签: none

添加新评论