返回
前端面试日精进 —— 第534天
见解分享
2023-12-02 19:18:46
哈喽,大家好,我是jsliang。
今天是前端面试日精进的第534天,也是我折腾前端的第n天。
今天,我将继续给大家分享我前端面试的学习心得,希望能够对大家有所帮助。
今天,我给大家分享的是前端面试中经常会遇到的一个问题:“什么是闭包?”
闭包是指能够访问另一个函数作用域中变量的函数。
例如,以下代码中,内部函数foo可以访问外部函数bar的作用域中的变量x:
function bar() {
var x = 10;
return function foo() {
console.log(x);
};
}
var f = bar();
f(); // 10
闭包的优点在于,它可以让我们在函数执行完毕后仍然能够访问函数内部的变量。
例如,以下代码中,我们使用闭包来实现一个计数器:
function counter() {
var count = 0;
return function() {
return ++count;
};
}
var c = counter();
c(); // 1
c(); // 2
c(); // 3
闭包的缺点在于,它可能会导致内存泄漏。
例如,以下代码中,我们使用闭包来保存一个对DOM元素的引用:
var element = document.getElementById('my-element');
var handler = function() {
console.log(element);
};
element.addEventListener('click', handler);
当element被销毁后,handler仍然会持有对element的引用。这可能会导致内存泄漏,因为垃圾回收器无法回收element。
为了避免内存泄漏,我们可以使用弱引用来保存对DOM元素的引用。
例如,以下代码中,我们使用弱引用来保存对element的引用:
var element = document.getElementById('my-element');
var handler = function() {
console.log(element);
};
element.addEventListener('click', handler);
var weakRef = new WeakRef(element);
当element被销毁后,weakRef将不再持有对element的引用。这将防止内存泄漏。
好了,以上就是我对闭包的分享。希望对大家有所帮助。
如果你有其他关于前端面试的问题,欢迎留言给我。我会尽力解答。
好了,今天的分享就到这里。我们明天见。
Bye~