来学习一道面试题
让我们先来复习一下闭包的概念,闭包就是外部函数嵌套一个内部函数,并且内部函数引用外部函数的局部变量,这样的结构构成闭包。
由于闭包的存在,所以外部函数执行完毕后,内部函数引用的变量不会被gc(内存回收机制)回收
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script>
var a= 0,b=0;
function A(a){
A=function(b){console.log(a+b++);}
console.log(a);
}
A(1); //1
A(12); //13
</script>
</body>
</html>正确的输出结果为1 13
我们来分析一下执行过程,其实也很简单,主要就是细心一点
第一步执行A(1)的时候,形参a接收到的实参为1,我们发现A有一个内部函数,
发现内部函数也使用了变量a,并将引用指向了它的外部函数的变量a,
从而构成闭包(也就是说函数执行完毕后,a不会被内存回收机制回收,引用值为1)。
接着执行console.log(a) 执行结果是1。
第二步执行A(12)的时候,由于上一步已经将A重新赋值新函数。
A = function(b){console.log(a+b++)}
形参b接收到实参为12,由于闭包的原因,a的值依然为1,所以a+(b++) = 1+12=13
所以输出结果为13
通过以上的分析,是不是觉得很简单....哈哈