面试题答案
一键面试闭包对内存管理的影响及避免内存泄漏
- 闭包对内存管理的影响:
- 闭包会使得函数内部的变量在函数执行完毕后依然被保留在内存中,因为闭包持有对这些变量的引用。例如:
function outer() {
let data = 'private data';
function inner() {
console.log(data);
}
return inner;
}
let closureFunc = outer();
closureFunc();
在上述代码中,outer
函数执行完毕后,data
变量本应被垃圾回收机制回收,但由于inner
函数(闭包)对data
的引用,data
依然保留在内存中。
2. 避免因闭包导致的内存泄漏:
- 及时释放引用。当不再需要闭包时,将引用闭包的变量设置为
null
,让垃圾回收机制能够回收相关内存。例如:
function outer() {
let data = 'private data';
function inner() {
console.log(data);
}
return inner;
}
let closureFunc = outer();
closureFunc();
// 不再需要闭包时
closureFunc = null;
Symbol类型在JavaScript类型系统中的独特作用及其与内存管理的关系
- Symbol类型的独特作用:
- 独一无二的值:Symbol类型创建的是独一无二的值,即使使用相同描述创建的Symbol也是不同的。例如:
let sym1 = Symbol('description');
let sym2 = Symbol('description');
console.log(sym1 === sym2); // false
- 对象属性键:可作为对象的属性键,用于创建独一无二的属性,避免属性名冲突。例如:
let obj = {};
let sym = Symbol('unique key');
obj[sym] = 'value';
console.log(obj[sym]); // value
- 与内存管理的关系:
- Symbol作为对象属性键时,当对象不再被引用且Symbol没有其他地方引用时,相关内存会被垃圾回收机制回收。但如果Symbol被其他地方(如闭包)持有引用,即使对象本身被释放,包含该Symbol属性的部分内存可能不会被回收,可能导致类似闭包造成的内存泄漏情况。例如,如果在闭包内部创建了一个Symbol并作为对象属性,闭包一直存在时,相关内存不会被回收。