返回

闭包进阶:用笔试题彻底搞懂闭包

前端







## 闭包笔试题

**1. 以下代码中,闭包变量的值是多少?** 

```js
function fun(n) {
  var a = 1;
  function innerFun(m) {
    var b = 2;
    return a + b + m;
  }
  return innerFun(n);
}

console.log(fun(3));

2. 以下代码中,变量x的值是多少?

function outer() {
  var x = 1;
  return function() {
    return ++x;
  };
}

var inner = outer();
console.log(inner());
console.log(inner());

3. 以下代码中,window.a的值是多少?

var a = 10;
(function() {
  a = 20;
})();
console.log(window.a);

4. 以下代码中,f函数返回的结果是什么?

function f(x) {
  return function(y) {
    return x + y;
  };
}

var g = f(2);
console.log(g(3));

5. 以下代码中,当n的值为0时,闭包变量a的值是多少?

for (var i = 0; i < 3; i++) {
  (function(n) {
    var a = n;
  })(i);
}

console.log(a);

答案和解析

1. 6

闭包变量a的值在函数fun中定义,为1。函数innerFun是函数fun的内部函数,因此它可以访问闭包变量a。当innerFun函数调用时,它将参数m的值加到ab的值上,因此返回结果为6。

2. 2

函数outer返回了一个闭包,该闭包引用了变量x。每次调用这个闭包,它都会增加x的值。因此,第一次调用返回2,第二次调用返回3。

3. 10

自执行匿名函数中对a的赋值操作只会在该函数的作用域内有效。因此,它不会改变全局变量window.a的值。因此,window.a的值仍然是10。

4. 5

函数f返回一个闭包,该闭包接收一个参数y并将其加到闭包变量x的值上。因此,当g函数调用时,它将参数3加到闭包变量2的值上,返回结果为5。

5. undefined

变量a在循环中被声明为var,这意味着它是一个全局变量。然而,每次迭代循环都会创建一个新的作用域,该作用域都有自己对a变量的副本。因此,当循环结束后,只有最后一个作用域的a变量仍然存在,其值为2。在循环外部,a变量的值为undefined