← 返回目录

第 3 卷

第 3 / 19 卷日期:

文能按规则访问自身及上层作用域的变量。

  1. 隔离作用域,避免命名冲突:不同执行上下文的变量对象相互独立,作用域链限定了变量的查找范

围,避免了不同作用域中的变量相互干扰。

  1. 支撑闭包的实现:当内部函数被外部引用时,其作用域链会被保留,使得内部函数即使在外部作用

域执行,也能通过作用域链访问到其定义时的上层作用域变量。

示例(作用域链的变量查找过程):

Code block

1var globalVar = "全局变量";

2function outer() { 3var outerVar = "外层函数变量";

4function inner() { 5var innerVar = "内层函数变量";

6// 变量查找顺序:

7// 1.先查找当前inner函数的变量对象:找到innerVar
8// 2.若未找到,向上查找outer函数的变量对象:找到outerVar
9// 3.若仍未找到,向上查找全局执行上下文的变量对象:找到globalVar
10console.log(innerVar, outerVar, globalVar);
11//输出:内层函数变量外层函数变量全局变量
12}
13inner();
14 }
15 outer();
  1. 闭包是什么?请分享你对闭包的理解,以及它在JavaScript中的用途。

(1)闭包(Closure)的定义

闭包是JavaScript中的一种特殊现象,当一个内部函数引用了其定义时的上层作用域(通常是外层函数作用域)的变量,且该内部函数被导出到其定义作用域之外执行时,就形成了闭包。

通俗理解:闭包就像一个“容器”,它保留了内部函数对上层作用域变量的引用,使得即使外层函数已经执行完毕(调用栈弹出),其内部的变量也不会被垃圾回收器回收,内部函数仍能访问到这些变

量。

示例:

Code block

6console.log(count);

7} 8// 将inner导出到outer作用域之外

9return inner;

10} 11

12const fn = outer();// outer执行完毕,返回inner函数
13fn();// 1(inner在外部执行,仍能访问并修改count)
14fn();// 2(count未被销毁,持续保留状态)

(2)对闭包的核心理解

  1. 闭包的本质:作用域链的持久化,内部函数的作用域链保留了对上层作用域变量对象的引用,阻止

了上层变量的销毁。

  1. 闭包的形成条件:① 存在嵌套函数(内部函数+外层函数);② 内部函数引用了外层函数的变量/

函数;③ 内部函数被导出到外层函数作用域之外(如return、赋值给全局变量等)。

  1. 闭包的双刃剑:既可以保留变量状态,也可能导致内存泄漏(若闭包长期持有无用变量未释放)。

(3)闭包的用途

  1. 保存变量状态(持久化数据):可以在多次函数调用之间共享并保留变量状态,无需使用全局变

量,避免全局变量污染。例如:计数器、缓存数据等。

Code block

1// 缓存工具:使用闭包保存缓存数据 2function createCache() {

3const cache = {};//缓存对象,被闭包保留
4return {
5set: function(key, value) {
6cache[key] = value;
7},
8get: function(key) {
9return cache[key];
10}
11};
12}
13const myCache = createCache();
14myCache.set("name", "张三");
15console.log(myCache.get("name"));//张三(缓存数据被持久化)

Code block

1// 模块化:私有变量和方法,仅暴露公开接口 2const module = (function() {

3// 私有变量 4const privateVar = "私有变量";

5// 私有方法 6function privateFn() {

7return privateVar + "被访问";

8} 9// 暴露公开接口

10return { 11publicFn: function() {

12return privateFn();

13} 14};

15})();

16console.log(module.publicFn()); // 私有变量被访问 17console.log(module.privateVar); // undefined(无法访问私有变量)

  1. 柯里化(函数柯里化):将多参数函数转换为单参数函数的嵌套,利用闭包保留参数状态。

Code block

1// 函数柯里化示例 2function add(a) {

3return function(b) { 4return a + b; // 闭包保留参数a

5};

6} 7const add5 = add(5);

8console.log(add5(3)); // 8(保留了a=5的状态)

9console.log(add5(10)); // 15

10. 能否详细说明什么是执行上下文(Execution Context)?它是如何影

响JavaScript代码的执行?

(1)执行上下文(Execution Context)的定义

执行上下文是JavaScript引擎为每一段可执行代码(全局代码、函数代码、eval代码)创建的运行环

全站分卷索引 · 19 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷