gpt4 book ai didi

JavaScript:克隆一个函数

转载 作者:IT王子 更新时间:2023-10-29 02:43:15 25 4
gpt4 key购买 nike

在 JavaScript 中克隆函数(有或没有其属性)的最快方法是什么?

想到的两个选项是 eval(func.toString())function() { return func.apply(..) }。但我担心 eval 和包装的性能会使堆栈变得更糟,如果应用很多或应用于已经包装的,可能会降低性能。

new Function(args, body) 看起来不错,但是在 JS 中没有 JS 解析器的情况下,我如何可靠地将现有函数拆分为 args 和 body?

提前致谢。

更新:我的意思是能够做到

var funcB = funcA.clone(); // where clone() is my extension
funcB.newField = {...}; // without affecting funcA

最佳答案

这是一个更新的答案

var newFunc = oldFunc.bind({}); //clones the function with '{}' acting as its new 'this' parameter

但是 .bind 是 JavaScript 的现代 ( >=iE9 ) 特性(带有 compatibility workaround from MDN )

注意事项

  1. 不克隆函数对象附加的属性包括原型(prototype)属性。感谢@jchook

  2. 新函数 this 变量与 bind() 上给出的参数卡住,即使在新函数 上也是如此apply() 调用。感谢@Kevin

function oldFunc() {
console.log(this.msg);
}
var newFunc = oldFunc.bind({ msg: "You shall not pass!" }); // this object is binded
newFunc.apply({ msg: "hello world" }); //logs "You shall not pass!" instead
  1. 绑定(bind)函数对象,instanceofnewFunc/oldFunc 视为相同。感谢@Christopher
(new newFunc()) instanceof oldFunc; //gives true
(new oldFunc()) instanceof newFunc; //gives true as well
newFunc == oldFunc; //gives false however

关于JavaScript:克隆一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1833588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com