function test() {
var n = 4399;
function add() {
n++;
console.log(n);
}
return { n, add };
}
var result = test();
var result2 = test();
result.add();//4400
result.add();//4401
console.log(result.n);//4399
result2.add();//4400
test是一个外部函数,它返回一个内部函数,这个内部函数可以访问并修改 test中的 n 变量,即使 test已经执行完毕。这样,每次调用 n
,它都会记住上次调用的状态。这就是闭包的一个典型用法。由此,result.add()两次调用都会根据上次状态值+1
为什么result.n打印是4399呢?
原因在于result
对象返回的是一个包含属性n和方法add的对象,而这个属性n的值是在test函数内部定义并赋值为4399的。尽管add
方法会修改作用域内的局部变量n,但每次调用test
函数时都会创建新的n变量,它与之前返回对象中的n属性值是分离的。
当执行var result = test();
和var result2 = test();
时,每次调用test
函数都会创建一个新的作用域,并且在其中生成一个新的n
变量。所以,result和result2分别拥有独立的n
值和add
方法。