function test() {
var n=1;
var add = function () {
n++;
console.log(n);
};
return{n:n,add:add};
}
var t1=test();
var t2=test();
t1.add();//输出2
t1.add();//输出3
var b = t1.n;
这里的b为什么还是1?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
应该这样写:
你之前的写法应该是类似这样的:
执行到
var t1 = test()后,变量 t1 的结构:即使后面再怎么执行
t1.add(), 都没有操作已经赋值的变量 t1,这里注意仅仅是闭包中的 n 变了,t1.n 已经在执行上面代码段的时候赋值了,后续又没有操作 t1,t1.n 当然不会变咯这里闭包返回的t1实际上是这样的 {n:1,add:add}, 返回的并不是test内n的引用, 所以t1.n等于1
试试这段代码
首先
闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
在test内部打印n
输出:
由此可见 test中的n以及它的值一直存放在内存中。
为什么会这样呢?原因就在于test是add的父函数,而add被赋给了一个全局变量,这导致add始终在内存中,而add的存在依赖于test,因此test也始终在内存中,不会在调用结束后,被垃圾回收机制回收。