返回

前端面试避坑指南:JS常见问题与答案持续更新

前端

一、JS闭包

什么是闭包?

闭包是指函数内部可以访问其外部变量的一种现象。这些变量在函数执行完毕后依然保持活性状态,即使是在函数返回后也是如此。

闭包产生的原因

闭包的产生与原型/原型链相关。原型是一个对象,所以也称原型对象prototype。为了解决函数内存浪费的问题,JavaScript引入了原型共享机制。当函数被调用时,JavaScript会创建一个新的执行上下文,并将该函数的prototype对象与该执行上下文关联起来。函数内部的变量被存储在该执行上下文中,并且这些变量可以通过prototype对象被函数内部的代码访问到。

闭包的应用

  • 私有变量:可以通过闭包创建私有变量,即只在函数内部可访问的变量。
  • 函数柯里化:可以通过闭包实现函数柯里化,即把一个多参数函数转换为一个单参数函数。
  • 事件处理:可以通过闭包来实现事件处理,即当事件发生时,函数内部的变量可以被访问到。

二、原型/原型链

什么是原型?

原型是JavaScript中一种特殊的对象,它允许对象共享属性和方法。每个对象都有一个prototype属性,指向其原型对象。原型对象也有一个prototype属性,依次类推,直到最终指向null。

原型链的查找过程

当对象访问一个属性或方法时,JavaScript会沿着原型链向上查找,直到找到该属性或方法。如果在当前对象中找不到该属性或方法,JavaScript就会在原型对象中查找,依次类推,直到最终在null对象中查找。

原型链的应用

  • 继承:可以通过原型链实现继承,即子对象可以继承父对象的属性和方法。
  • 多态性:可以通过原型链实现多态性,即子对象可以覆盖父对象的方法,从而实现不同的行为。

三、原型对象prototype

prototype是什么?

prototype是JavaScript中一个特殊的属性,指向对象的原型对象。prototype属性是所有函数都有的,并且prototype对象也是一个函数。

prototype的用法

  • 添加属性和方法:可以通过prototype属性给对象添加属性和方法。这些属性和方法将被所有继承该对象的子对象所共享。
  • 继承:可以通过prototype属性实现继承。子对象的prototype属性指向父对象的prototype对象,从而子对象可以继承父对象的所有属性和方法。

四、函数内存浪费的问题

函数内存浪费的问题是什么?

在JavaScript中,每个函数都会在内存中创建一个新的执行上下文。当函数被调用时,该执行上下文会保存函数的参数、局部变量以及函数体中的代码。当函数返回后,该执行上下文及其保存的变量和代码都会被销毁。这种机制会导致函数每次被调用时都会创建新的执行上下文,从而造成内存浪费。

如何解决函数内存浪费的问题?

为了解决函数内存浪费的问题,JavaScript引入了原型共享机制。当函数被调用时,JavaScript会创建一个新的执行上下文,并将该函数的prototype对象与该执行上下文关联起来。函数内部的变量被存储在该执行上下文中,并且这些变量可以通过prototype对象被函数内部的代码访问到。由于prototype对象是共享的,因此函数每次被调用时都不需要创建一个新的执行上下文,从而避免了内存浪费。

五、共享方法

共享方法的原理

共享方法是指多个对象可以共享同一个方法。在JavaScript中,可以通过prototype属性实现共享方法。给prototype对象添加一个方法,所有继承该对象的子对象都可以使用该方法。

共享方法的应用

  • 减少代码冗余:可以通过共享方法减少代码冗余。
  • 提高代码可维护性:可以通过共享方法提高代码的可维护性。