我有一个数组,例如:
argumentsArray = ["arg1", "arg2"];
我有一个功能:
function1 = function () {
console.log(arg1);
console.log(arg2);
};
当然,执行function1
会导致错误,因为arg1
和arg2
未定义。但我不想定义这些,我希望它们用作参数,如下:
function1 = function (arg1, arg2) {
console.log(arg1);
console.log(arg2);
};
现在我们可以在向它传递两个参数时执行function1
:
function1("string1", "string2");
// will log "string1" and "string2"
但问题是,我无法更改function1
的源代码。我不能编辑它的论点。我知道bind()
和apply()
函数,但它们会做错误的事情,因为它实际应用了字符串:
getFunction1WithArgumentsFromArray = function () {
return function () {
return function1.apply(this, argumentsArray);
};
};
getFunction1WithArgumentsFromArray();
// would return function1("arg1", "arg2");
问题是,arg1
和arg2
尚未定义。它们不是字符串或任何其他东西。我的代码看起来像这样:
function1 = function () {
console.log(arg1);
console.log(arg2);
};
argumentsArray = ["arg1", "arg2"];
defineArgs = function() {
arg1 = "hey";
arg2 = "hello";
};
getFunction1WithArgumentsFromArray = function (argumentsArray) {
argumentsToUse = convertArrayOfStringsToArrayOfVariables(argumentsArray);
// HOW???
return function () {
return function1(argumentsToUse[0], argumentsToUse[1]);
};
// or what should i put here???
};
getFunction1WithArgumentsFromArray();
// should return this:
// function1 = function(arg1, arg2) {
// console.log(arg1);
// console.log(arg2);
// };
// without executing it.
所以我真正想要的是一个函数,它将一个字符串数组转换为一个带有这些字符串名称的变量数组:
["arg1", "arg2"] --> [arg1, arg2]
但直接制作这将是一个问题,因为JavaScript然后搜索这些变量。正如我所说,这些变量没有定义......
我的想法是使用apply()
并传递数组with eval("string")
,如下所示:
getFunction1WithArgumentsFromArray = function () {
return function () {
return function1.apply(
this,
[eval(argumentsArray[0]), eval(argumentsArray[1])]
);
};
};
getFunction1WithArgumentsFromArray();
// would return "arg1 is not defined", because eval() executes the function as I define it
这对您来说似乎非常不必要,但正如我已经说过的,我无法更改function1
所以我必须在另一个函数中创建它的参数列表。我的意思是,当然我可以更改它,但我正在处理的项目使用数组来获取参数。
答案 0 :(得分:1)
正如我在评论中所说,定义arg1和arg2似乎是不必要的,因为无论你在哪里创建对象,你都必须已经对它进行了一些引用。
当你将这些传递给function1时,你可以轻松访问像这样的参数
function1 = function () {
var i;
for(i=0; i<arguments.length;i++){
console.log(arguments[i]); // do anything with arguments[i] == arg1, arg2,
...
}
};