原型链、闭包、事件循环等概念,通过手写代码题验证理解深度

以下是 JavaScript 核心概念(原型链、闭包、事件循环)的深度解析及手写代码示例,结合高频面试题场景设计:

一、原型链实现与手写题

1. 原型链本质

  • 机制 ‌:通过 proto 隐式原型链向上查找属性,终点为 Object.prototype.proto(null)

  • 手写继承‌(ES5 组合继承):

javascript 复制代码
function Parent(name) {

  this.name = name;

}

Parent.prototype.sayName = function() {

  console.log(this.name);

};

 

function Child(name, age) {

  Parent.call(this, name); // 构造函数继承属性

  this.age = age;

}

Child.prototype = Object.create(Parent.prototype); // 原型链继承方法

Child.prototype.constructor = Child; // 修复构造函数指向

2. 高频面试题

  • 实现 instanceof‌:
ini 复制代码
function myInstanceof(obj, Constructor) {

  let proto = obj.__proto__;

  while (proto) {

    if (proto === Constructor.prototype) return true;

    proto = proto.__proto__;

  }

  return false;

}

二、闭包应用与内存管理

1. 闭包核心

  • 定义‌:函数嵌套 + 内部函数引用外部变量,形成持久词法作用域

  • 经典场景‌:

    • 模块化(私有变量)

    • 防抖/节流函数

2. 手写题示例

·‌实现计数器‌:

ini 复制代码
function createCounter() {

  let count = 0;

  return {

    increment: () => ++count,

    getCount: () => count

  };

}

const counter = createCounter();

counter.increment(); // 1
  • 内存泄漏风险‌:未使用的闭包变量需手动解除引用(如 counter = null)

三、事件循环与异步编程

1. 执行机制

  • 宏任务‌:script、setTimeout、setInterval

  • 微任务‌:Promise.then、MutationObserver

  • 执行顺序‌:同步代码 → 微任务队列清空 → 宏任务

2. 手写题示例

·‌输出顺序分析‌:

javascript 复制代码
console.log('1');

setTimeout(() => console.log('2'), 0);

Promise.resolve().then(() => console.log('3'));

console.log('4');

// 输出:1 → 4 → 3 → 2
  • 实现 Promise.all‌:
ini 复制代码
function promiseAll(promises) {

  return new Promise((resolve, reject) => {

    let results = [];

    let completed = 0;

    promises.forEach((promise, i) => {

      Promise.resolve(promise)

        .then(res => {

          results[i] = res;

          if (++completed === promises.length) resolve(results);

        })

        .catch(reject);

    });

  });

}

四、综合面试题

1. 原型链 + 闭包

ini 复制代码
function Foo() {

  this.name = 'foo';

  this.say = function() { console.log(this.name); };

}

Foo.prototype.name = 'prototype';

const foo = new Foo();

 

foo.say(); // 'foo'(实例属性优先)

foo.__proto__.say(); // TypeError(原型链无此方法)

2. 事件循环 + 闭包

css 复制代码
for (var i = 0; i < 3; i++) {

  setTimeout(() => console.log(i), 0);

}

// 输出:3, 3, 3(var 无块级作用域)

// 修复:改用 let 或 IIFE 创建闭包作用域

五、核心要点总结

概念 关键点 面试重点
原型链 继承实现、instanceof 原理、属性查找优先级 手写继承/new 实现
闭包 词法作用域、内存泄漏、模块化应用 防抖/节流实现
事件循环 宏/微任务优先级、Promise 链式调用、async/await 转换 输出顺序分析

通过手写代码可验证对底层机制的理解深度,建议结合具体业务场景(如性能优化、状态管理)进行实践。

相关推荐
林太白2 分钟前
Rust-导入导出
前端·javascript·后端
Ice_Sugar_715 分钟前
CSS:BFC
前端·css
林太白19 分钟前
Vue3 导入导出
前端
_Kayo_32 分钟前
JS深拷贝 浅拷贝、CSS垂直水平居中
开发语言·前端·javascript
key_Go43 分钟前
18.WEB 服务器
服务器·前端·firefox
碎像1 小时前
uni-app实战教程 从0到1开发 画图软件 (学会画图)
前端·javascript·css·程序人生·uni-app
Hilaku1 小时前
从“高级”到“资深”,我卡了两年和我的思考
前端·javascript·面试
WebInfra2 小时前
Rsdoctor 1.2 发布:打包产物体积一目了然
前端·javascript·github
用户52709648744902 小时前
SCSS模块系统详解:@import、@use、@forward 深度解析
前端
兮漫天2 小时前
bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(十一)
前端·vue.js