gpt4 book ai didi

javascript - 在 JavaScript 中动态向函数添加参数

转载 作者:行者123 更新时间:2023-12-03 08:31:52 25 4
gpt4 key购买 nike

我正在测试我的应用程序,我有一个像这样工作的依赖项注入(inject)系统(我在此处粘贴了一个非常简化的版本)

test.start = function(callback) {
// do stuff;
load(callback);
}
function load(callback) {
var args = ...// read callback's arguments
// args = ['moduleA', 'moduleB'];
var injectedArgs = args.map(function(a) {
return require('./lib/' + a);
});
// call function with deps injected
callback.apply(null, injectedArgs);
}

// test.js
test.start(function(moduleA, moduleB) {
moduleA.functionA();
moduleB.functionB();
});

我需要做的是在调用回调并开始测试之前执行异步作业,在这种特殊情况下,这将是

test.start = function(callback) {
// do stuff;
load(function(moduleA, moduleB, moduleC) {
moduleC.resetData(function() {
return callback(moduleA, moduleB);
})
});
}

对于所有具有不同模块作为回调参数的测试,我需要使其动态化。要求是

  • 我不想更改测试定义
  • 我必须打电话load每次测试仅一次

所以基本上我需要创建添加 moduleC 的中间函数参数,运行 resetData函数并调用原始回调。

我可以使用构建动态扩展参数列表 var fn = new Function(newArgumentList, /*function body*/)但我无法附加正确的函数体(使用字符串),因为我丢失了原始的回调上下文。

更新

DI 库是 modularity它读取回调定义以获取依赖关系。基本上,给定回调 function(foo, bar) { ... }我需要创建一个新的 function(foo, bar, db) { db.resetData(function() { return callback(foo, bar) } )}

最佳答案

如果 load 本身是您可以更改的内容(例如,不是测试定义的一部分),您会很高兴知道这很容易做到:您使用 函数#apply:

function load(callback) {
var origCallback;
if (/*flag saying you need to do this*/) {
origCallback = callback;
callback = function() {
/*...do your injected work here...*/
return origCallback.apply(this, arguments); // `arguments` looks like pseudo-code, but it isn't; it's an identifier created in the function's scope (for non-arrow functions)
};
}
var args = ...// read callback's arguments
// args = ['moduleA', 'moduleB'];
var injectedArgs = args.map(function(a) {
return require('./lib/' + a);
});
// call function with deps injected
callback.apply(null, injectedArgs);
}

如果您无法更改 load,您甚至可以这样做,前提是您可以更新 load 符号以使其指向新功能:

var oldload = load;
load = function() {
/*...do your reset work here...*/
return oldload.apply(this, arguments);
};

如果您好奇,是的,您可以更新函数声明创建的符号(是的,这是根据规范,而不是“棘手”)。例如,这是完全有效的:

function foo() {
console.log("I'm foo");
}
var oldFoo = foo;
foo = function() {
console.log("I'm the new foo");
return oldFoo.apply(this, arguments);
};
foo(); // "I'm the new foo", then "I'm foo"

示例:

function foo() {
snippet.log("I'm foo");
}
var oldFoo = foo;
foo = function() {
snippet.log("I'm the new foo");
return oldFoo.apply(this, arguments);
};
foo(); // "I'm the new foo", then "I'm foo"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

关于javascript - 在 JavaScript 中动态向函数添加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33308680/

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