返回
闭包进阶:用笔试题彻底搞懂闭包
前端
2023-11-17 11:09:06
## 闭包笔试题
**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
的值加到a
和b
的值上,因此返回结果为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
。