面试题答案
一键面试TypeScript命名空间
- 作用域处理:
- 命名空间通过
namespace
关键字定义,它创建了一个局部作用域。在命名空间内声明的变量、函数、类等标识符只在该命名空间内可见,避免了全局作用域的污染。例如:
namespace MyNamespace { let myVar = 10; function myFunction() { return myVar; } } // 这里不能直接访问myVar和myFunction,它们在MyNamespace作用域内
- 命名空间通过
- 模块加载机制:在早期,TypeScript命名空间主要用于组织代码结构,在编译时会将所有相关代码合并到一个文件中。加载机制依赖于传统的
<script>
标签引用顺序。例如在HTML中:
确保依赖的命名空间先加载。<script src="namespace1.js"></script> <script src="namespace2.js"></script>
- 性能优化:
- 小型项目:对于小型项目,命名空间简洁明了,可直接合并代码,减少文件请求数量,提升加载性能。例如一个简单的网页特效脚本,使用命名空间将相关功能组织在一起,所有代码打包成一个文件,浏览器只需一次请求。
- 大型项目:大型项目中,命名空间的维护成本会增加,因为随着代码量增多,依赖关系可能变得复杂且难以管理,性能优化需谨慎。可以将相关功能的命名空间进一步分组,在构建过程中进行代码拆分,按需求加载部分命名空间代码,减少初始加载体积。
现代模块系统(ES6模块和CommonJS等)
- 作用域处理:
- ES6模块通过
export
和import
关键字,每个模块都有自己独立的作用域。模块内声明的变量、函数等默认是私有的,只有通过export
导出才能被其他模块访问。例如:
// module1.ts let privateVar = 20; export function exportFunction() { return privateVar; }
- CommonJS模块(Node.js中常用)通过
exports
或module.exports
导出,同样每个模块有独立作用域。例如:
// module2.js let localVar = 30; exports.getVar = function() { return localVar; };
- ES6模块通过
- 模块加载机制:
- ES6模块:在浏览器中,ES6模块是异步加载的,可以通过
defer
或async
属性控制加载时机。在Node.js环境中,ES6模块的加载基于文件系统路径。例如:
import { exportFunction } from './module1.js';
- CommonJS模块:在Node.js中,CommonJS模块采用同步加载机制,第一次加载后会被缓存,后续引用直接从缓存中获取。例如:
const { getVar } = require('./module2.js');
- ES6模块:在浏览器中,ES6模块是异步加载的,可以通过
- 性能优化:
- 小型项目:对于小型项目,ES6模块的异步加载特性在浏览器环境下可提升加载性能,避免阻塞页面渲染。例如简单的前端页面展示模块,使用ES6模块异步加载,不影响页面其他内容加载。
- 大型项目:在大型项目中,ES6模块的tree - shaking特性(通过构建工具如Webpack实现)可以去除未使用的代码,减小打包体积。对于Node.js项目使用CommonJS模块,合理利用缓存机制,避免重复加载相同模块,同时通过代码拆分实现按需加载,提升性能。