我试图编写一个获取一些变量的JavaScript函数,并返回一个包含其值的函数,而不将它们作为参数或引用它们。
一个简单的例子:
function foo(a,b) {
return function(x) {
//doing something with values of a and b, for example:
return a*x + b;
}
}
所以,如果我这样做:
var c = foo(2,3);
var d = foo(4,5);
c和d看起来像:
c: function(x) {
return 2*x + 3;
}
d: function(x) {
return 4*x + 5;
}
我希望foo()在返回新函数之前用它们的值替换变量a,b。所以c和d不需要引用自己以外的一些变种。
我使用CasperJS并尝试动态创建由casper.evaluate()
执行的函数,这些函数对执行的函数进行沙盒化。这就是为什么它不会按照示例中描述的方式工作。
任何想法如何解决这个问题? 非常感谢!
编辑:
为什么我需要这个? 我尝试用CasperJS编写一个抽象的爬虫。所以有一个" main" -function访问一个包含多个函数的对象变量(var site = {...}),casper.evaluate()将逐个作为参数。这些功能在打开的网页上以沙盒形式执行,因此无法访问网页外的任何变量。他们可以做很多不同的事情,但大多数情况下他们会寻找一种包含链接/图像/引用的标记,替换此引用并在列表中返回所有这些标记。 此函数可用于链接,图像,css文件,js文件等,并且每个都只需要一个不同的选择器,属性名称(可能还有1-2个其他变量)。 我不能将它们作为这个函数的参数给出,因为每个函数可能需要不同数量的参数然后casper.evaluate(site [i] ['方法]#)调用不知道它们。它调用函数时没有任何参数。 这就是为什么我认为实现生成这些函数的函数将是最好的方法。但显然这并不像我计划的那样有效。
当然我可以复制这个函数并替换少数变量。但这会产生大量冗余代码并带来所有缺点。
另一个想法: 使用特定数量的参数调用函数,这些参数存储在同一个对象中:casper.evaluate(site [i] [' method'],site [i] [' arg0' ],现场[I] [' ARG1'] ...)
我认为这应该有效但不是很好,因为即使它不需要,每个函数都必须具有这个特定数量的参数。只有当函数不需要更多参数时,它才有效。
答案 0 :(得分:0)
function foo(a,b)
{
return new Function("x", "return " + a + "*x+" + b);
}
答案 1 :(得分:0)
也许这对你有用。这是您的示例,但允许执行具有任意数量参数的函数。
function foo() {
var func = function() {
//doing something with arguments of the original function:
return arguments;
};
var allArgs = Array.prototype.slice.call(arguments); // 1
allArgs.unshift(null); // 2
return Function.prototype.bind.apply(func, allArgs); // 3
}
null
放在参数列表的开头allArgs
数组的开头的null用作this
函数的bind
参数。使用示例:
var c = foo(1,2,3,4,5,6);
c(7); // returns: [1, 2, 3, 4, 5, 6, 7]