structuredclone 不支持函数,因为其基于 html 标准的结构化克隆算法仅处理可序列化类型(如对象、数组、date 等),而函数可能捕获闭包或依赖执行环境,无法安全序列化;含函数的对象会直接抛出 datacloneerror。

structuredClone 不支持函数,包含函数的对象会抛出错误。
为什么 structuredClone 无法克隆函数
structuredClone 基于 HTML 标准中的结构化克隆算法(Structured Clone Algorithm),该算法只支持可序列化的数据类型,例如对象、数组、Date、RegExp、Map、Set、ArrayBuffer 及其视图、Blob、File、ImageData 等。函数(包括普通函数、箭头函数、类方法、绑定函数等)不属于可克隆类型,因为它们可能捕获闭包、依赖执行环境或包含不可序列化的状态。
一旦目标对象中任意层级存在函数属性(哪怕只是对象的一个字段值是函数),调用 structuredClone 就会立即抛出 DataCloneError 异常,且不会进行部分克隆。
常见触发场景
- 对象直接包含方法:
{ name: "a", say: function() {} } - 类实例带有原型方法或实例函数字段
- 对象中嵌套了含函数的子对象或数组元素
- 使用箭头函数作为属性值:
{ handler: () => {} } - DOM 元素或事件监听器(内部含函数引用)
替代方案建议
若需复制含函数的对象,需根据实际用途选择合适策略,而非强行绕过 structuredClone 的限制:
- 手动浅拷贝 + 函数重绑定:对已知结构的对象,用展开运算符或 Object.assign 复制可序列化字段,再单独处理函数逻辑(如重新赋值或绑定上下文)
- 序列化后再还原(仅限纯数据):先用 JSON.stringify 去掉函数(自动忽略),再 JSON.parse,适用于配置类对象;但会丢失 Date、RegExp、undefined、Symbol、循环引用等
- 自定义深克隆工具(谨慎使用):如 lodash.cloneDeep 可处理函数(默认保留原引用),但它不保证安全,也不符合 structuredClone 的语义和安全性设计目标
- 重构数据模型:将函数逻辑与数据分离,让被克隆对象只承载纯数据,行为由外部模块或类统一管理
验证是否可克隆的小技巧
可在调用前简单检测对象是否“干净”:
function hasFunction(obj) {
if (typeof obj === 'function') return true;
if (obj !== null && typeof obj === 'object') {
return Object.values(obj).some(v => hasFunction(v));
}
return false;
}
// 使用前检查
if (!hasFunction(myObj)) {
const cloned = structuredClone(myObj);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











