怎样理解JavaScript的闭包

📅 发布时间:2026/7/4 14:45:54 👁️ 浏览次数:
怎样理解JavaScript的闭包
黑马的介绍闭包 内层函数 外层函数的变量 二者缺一不可//典型闭包 function outer(){ const a 1 function fn(){ console.log(a) } return fn } outer() //此时外部访问不了a但是如果函数内部是return fn 外部可以通过outer()打印a,这就保护了a的值不会被篡改javascript.info网站的介绍闭包是指一个函数可以记住其外部变量并可以访问这些变量。在某些编程语言中这是不可能的或者应该以一种特殊的方式编写函数来实现。但 如上 所述在 JavaScript 中所有函数都是天生闭包的只有一个例外将在 new Function 语法 中讲到。也就是说JavaScript 中的函数会自动通过隐藏的[[Environment]]属性记住创建它们的位置所以它们都可以访问外部变量。function makeCounter() { let count 0; return function() { return count; }; } let counter makeCounter(); alert( counter() ); // 0 alert( counter() ); // 1 alert( counter() ); // 2GPT的解释普通情况先看这个例子function test() { let num 100; console.log(num); } test();执行过程调用 test ↓ 创建变量 num ↓ 输出 100 ↓ test 执行结束 ↓ num 被销毁这里没有问题。返回函数的情况再看function test() { let num 100; return function() { console.log(num); } } const fn test();执行到这里时test() ↓ 创建 num ↓ 创建匿名函数 ↓ 返回匿名函数关键来了这个匿名函数里面用到了numfunction() { console.log(num); }JavaScript 引擎发现这个函数以后还要用到 num所以不会立即销毁num。而是把num 100和这个函数一起保留下来。类似于fn ├── 函数代码 └── 关联的变量环境 num 100这就是闭包。我个人的理解我之前的理解是这样的function makeCounter() { let count 0; return function() { return count; }; } let counter makeCounter(); alert( counter() ); // 0 alert( counter() ); // 1 alert( counter() ); // 2counter这个变量拿到了返回的function(){}这个匿名函数的地址这个函数本质上还是makeCounter里的函数。而这个地址里针对count所做的操作都是针对同一个count来进行的。目前看来我的理解并不是很对还是参考上面的吧。