返回

前端面试日精进 —— 第534天

见解分享

哈喽,大家好,我是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~