我正在使用 JavaScript 间谍库 simple-spy。
我发现当监视给定函数时,生成的间谍总是有一个 0。
这给我使用 这个柯里化函数带来了问题。
所以我提交了一个拉取请求,为 spy library 添加了 arity 透明度。
代码如下所示:
function spy(fn) {
const inner = (...args) => {
stub.callCount++;
stub.args.push(args);
return fn(...args);
};
// ends up a string like
// 'a,b,c,d'
// depending on the `fn.length`
const stubArgs = Array(fn.length)
.fill(null)
.map((m, i) => String.fromCodePoint(97 + i))
.join();
const stubBody = 'return inner(...arguments);';
// this seems to be the only way
// to create a function with
// programmatically specified arity
const stub = eval(
// the wrapping parens is to
// prevent it from evaluating as
// a function declaration
`(function (${stubArgs}) { ${stubBody} })`
);
stub.reset = () => {
stub.callCount = 0;
stub.args = [];
};
stub.reset();
return stub;
}
exports.spy = spy;
这似乎有效。
是否可以在不使用的情况下做到这一点eval
?
是否有可能将使用减少eval
到更少?
我知道这个间谍实现还有其他问题。它很简单,到目前为止它适用于我的用例。