Javascript:重用有界函数
Javascript: reuse bounded functions
本文关键字:函数 Javascript 更新时间:2023-09-26
标准Function.prototype.bind
方法在每次调用时创建一个新函数。我需要存储在某个地方并重用该函数的有界变体。
实现适用于对象参数的函数bindArg
不是火箭科学:
const fnStorage = new WeakMap();
function bindArg(fn, arg) {
if (!fnStorage.has(fn)) {
fnStorage.set(fn, new WeakMap());
}
if (!fnStorage.get(fn).has(arg)) {
fnStorage.get(fn).set(arg, fn.bind(null, arg));
}
return fnStorage.get(fn).get(arg);
}
此解决方案工作正常,但仅适用于对象参数。可以通过将WeakMap
标量参数更改为 Map
来完成标量参数。但这根本不好,因为Map
会保留对函数的有界变体的引用并防止垃圾回收它。
有没有办法实现bindArg
函数,它是完全不可变的,不会为任何类型的参数泄漏内存?
您可以将Map
用于基元数据类型,WeakMap
用于对象:
function isPrimitive(value) {
return Object(value) !== value;
}
var primStore = new Map;
var objStore = new WeakMap;
function bindArg(fn, arg) {
var store = isPrimitive(arg) ? primStore : objStore;
if (!store.has(arg)) store.set(arg, new WeakMap);
if (!store.get(arg).has(fn)) store.get(arg).set(fn, fn.bind(null, arg));
return store.get(arg).get(fn);
}
请注意,我们返回 store.get(arg).get(fn)
而不是 store.get(fn).get(arg)
。这种翻转对bindArg
函数的实际语义没有任何影响,但当我们想要区分原始数据类型和对象时,这是必要的。
编辑:或者,您可以创建一个新的WeakMap2
数据结构,该结构将基元值存储在Map
中,将对象存储在WeakMap
中,如下所示:
var WeakMap2 = defclass({
constructor: function () {
this.map1 = new Map;
this.map2 = new WeakMap;
if (arguments.length > 0) {
for (var object in argument[0]) {
if (isPrimitive(object))
throw new TypeError("Iterator value " +
object + " is not an entry object");
else this.set(object[0], object[1]);
}
}
},
get: function (key) {
return (isPrimitive(key) ? this.map1 : this.map2).get(key);
},
set: function (key, value) {
return (isPrimitive(key) ? this.map1 : this.map2).set(key, value);
},
has: function (key) {
return (isPrimitive(key) ? this.map1 : this.map2).has(key);
},
delete: function (key) {
return (isPrimitive(key) ? this.map1 : this.map2).delete(key);
}
});
function defclass(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}
function isPrimitive(value) {
return Object(value) !== value;
}
但是,我不推荐它,因为它增加了一个抽象层,使你的代码变慢。
相关文章:
- 从函数JavaScript返回不可变数组/对象
- 将对象传递给函数.JavaScript
- 如何定义const函数javascript(语法糖)
- 新的日期函数javascript
- TypeError:this.getAttribute不是一个函数-javascript
- 从函数javascript发送变量
- 扩展自容器函数Javascript
- 从内部函数javascript内部分配外部函数的对象
- 使用函数JavaScript中的函数
- 在这里使用回调函数(JavaScript)有什么好处吗
- 来自函数 Javascript 的 NaN 返回值 ||函数执行顺序
- 将“e”传递给一个新函数 - javascript
- 调用函数中的一个函数——Javascript
- 传递的变量不适用于我的函数-Javascript
- 如何将类方法设置为等于多个函数?-Javascript
- 显示php中的函数javascript
- 如何使用php代码创建函数Javascript弹出框
- 未调用的外部函数-javascript
- 如何在类中运行函数.Javascript
- 关闭mouseover上的一个函数——Javascript,jQuery