假设你已经在javascript中定义了一些函数 someFunc(),它可能有也可能没有定义自己的参数集。是否可以编写另一个函数来添加必需的参数并将该参数设置为 someFunc()的默认值?类似的东西:
var someFunc = function(arg1, arg2 ...){ Do stuff...}
var addRequired = function(argName, argValue, fn) {
Add the required default arg to a function...
}
addRequired("x", 20, someFunc);
现在someFunc的定义大致如下:
someFunc = function(x, arg1, arg2...) {
x = 20;
Do stuff...
}
我真正想要的是不仅将这个值绑定到一个函数(我已经知道如何实现),而且还绑定另一个对象引用相同的功能(该功能未提前知道,因为用户将定义它,但随后用户的代码可以访问此第二个对象引用以在其自己的功能中使用)。因此,在我上面的简单示例中,“20”值实际上是对象引用。
感谢您提供的任何帮助。
答案 0 :(得分:5)
像这样:
function addParameter(func, argIndex, argValue) {
return function() {
arguments[argIndex] = argValue;
arguments.length = Math.max(arguments.length, argIndex);
return func.apply(this, arguments);
};
}
someFunc = function(x, arg1, arg2...) {
Do stuff...
}
someFunc = addParameter(someFunc, 0, someValue);
答案 1 :(得分:1)
我相信我找到了答案,虽然在这个过程中,我开始意识到我并不需要为我的目的添加一个参数,我只需要在函数中添加引用。无论如何,为了达到我原本以为我想要的答案的目的,我提出了:
var someFunc = function(arg1,arg2){document.write(x+'<br />'+arg1+'<br />'+arg2)};
var addRequired = function(argName, argValue, fn){
var funcString = String(fn)
var paramPattern = new RegExp ('^function\\s*\\([^\\)]*\\b'+argName+'\\b[^\\)]*\\)');
var alreadyExists= paramPattern.test(funcString);
if(!alreadyExists) {
var insertPoint1 = funcString.indexOf('(')+1;
var insertPoint2 = funcString.indexOf('{')+1;
var newFunc = funcString.slice(0,insertPoint1)+argName+',' +funcString.slice(insertPoint1, insertPoint2)+argName+' = '+argValue+';' +funcString.slice(insertPoint2);
return eval('fn = '+newFunc);
}
}
someFunc = addRequired('x', 20, someFunc);
someFunc(1,2,3);
哪些测试用于查看arg是否已存在,如果不存在,则输出:
20
2
3
因此它实现了添加具有所需值的参数。我不知道这是否是实现它的“最佳”方式,但它确实有效。
编辑于2010年7月9日添加此信息:
当我将其应用于与上述示例不同的情况时,我发现上面有一个“错误”(我现在不记得那个错误,那是几个星期前)。我想出了一些有用的东西。注意,以下内容不会进行任何检查以查看传入函数的参数是否已经存在,事实上,目前它期望的函数不会自动获取参数(我确信这可以重写以适应带参数的函数,类似于我上面所做的)。这是我实际使用的简单布局:
var addRequired = function(thisObj, func) {
/*Here I write a string that contains additional functions to add to the
passed in function ('func' argument above). In this case, I just show
a simple addition function for the example.*/
var str = 'myAddedFunction = function(x, y) {return x+y}';
/*Here I am taking the string for that new function I want to add, and
appending the old function to it as a string after I have stripped it
of its 'function () {' at the beginning and its '}' at the end. NOTE:
If I did not care about adding a function, but just arguments, I would
have just assigned 'str' the value after the '+' sign below */
str = str + String(func).replace(/^function\s*\([^\)]*\)[\s\n]*{/, ' ').replace(/}$/, '');
/*Here I create a new function using the actual new Function declaration so
I can define my arguments, and using the new string I created that has
my new functionality in it along with the user supplied functionality*/
var newFunc = new Function('myArg1', 'myArg2', str);
/*Now I return an anonymous function that itself returns the new function
with the object that is supposed to be the 'this' of the new function
which was passed in as the 'thisObj' argument*/
return function() {return newFunc.apply(thisObj, arguments)};
}
返回值分配给函数中传递的原始值,因此:
var userFunc = function() { *do some stuff* }; //representation only
userFunc = addRequired(someObj, userFunc); //overwrite with new functionality
这允许我做的是让用户编写一个函数,提前知道他们可以访问我提供的函数(myAddedFunction
)以及我提供的参数(其职能范围内myArg1
,myArg2
)。这可能看起来很抽象,比如“为什么我会需要它”,但对于我正在处理的项目,我(和用户)需要它,因为我利用用户的功能(添加我的功能)来执行一些操作用户基于我提供的参数。
我忘了提及,为了我的目的,我不需要将我要制作的字符串传递给新变量(它总是与我添加的变量相同),但如果我有,我会我做了类似于我的帖子的第一部分所做的事情,在那里我传入(可能是数组)字符串以制作参数值,并使用它们来构建我的newFunc
。