每个 JavaScript 程序员都必须知道闭包是什么。在 JavaScript 面试中,你很可能会被问到闭包的概念。
以下是 7 个有关 JavaScript 闭包的面试题,比较有挑战性。
不要查看答案或运行代码,看看自己的水平到底如何。做完这些题大约需要半小时左右。
1. 热身
有以下函数 clickHandler
,immediate
和delayedReload
:
let countClicks = 0;
button.addEventListener('click', function clickHandler() {
countClicks++;
});
const result = (function immediate(number) {
const message = `number is: ${
number}`;
return message;
})(100);
setTimeout(function delayedReload() {
location.reload();
}, 1000);
这3个函数中哪个能够访问外部范围变量?
答案
clickHandler
能够从外部作用域访问变量countClicks
。immediate
无法访问外部作用域中的任何变量。delayedReload
从全局作用域(也就是最外层作用域)中访问全局变量location
。
2. 丢失的参数
下列代码输出什么:
(function immediateA(a) {
return (function immediateB(b) {
console.log(a); // => ?
})(1);
})(0);
答案
输出为:0
用参数 0
调用 immediateA
,因此 a
参数为 0
。
immediateB
函数嵌套在 immediateA
函数中,是一个闭包,它从外部 immediateA
作用域中得到 a
变量,其中 a
为 0
。因此 console.log(a)
的输出为 0
。
3. 谁是谁
下面的代码将会输出什么内容?
let count = 0;
(function immediate()