返回不带参数的变量函数

时间:2015-06-18 19:23:23

标签: javascript function return casperjs

我试图编写一个获取一些变量的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'] ...)

我认为这应该有效但不是很好,因为即使它不需要,每个函数都必须具有这个特定数量的参数。只有当函数不需要更多参数时,它才有效。

2 个答案:

答案 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
}
  1. 获取outher函数的所有参数并将它们转换为数组
  2. null放在参数列表的开头
  3. 返回内部函数的副本,该函数绑定了来自其他函数的所有参数。我们将allArgs数组的开头的null用作this函数的bind参数。
  4. 使用示例:

    var c = foo(1,2,3,4,5,6);
    c(7); // returns: [1, 2, 3, 4, 5, 6, 7]