是否可以执行两次匿名功能?

时间:2012-07-10 23:31:30

标签: javascript closures

我想定义一个自动执行匿名函数,但让它使用不同的参数运行几次。

(function(x){ console.log(x*x)})(2)
// output: 4

// I know this syntax is wrong, I am
// demonstrating how I would imagine it being implemented
(function(x){ console.log(x*x)})(2)(5)
// output is error, desired output: 4{Newline}25

有可能吗?


编辑:根据@Charmander的回答,似乎有可能 而且几乎肯定是一个坏主意,但这可以像我期望的那样......

(function(x){ console.log(x*x); return arguments.callee})(2)(5)

2 个答案:

答案 0 :(得分:6)

您可以将匿名函数存储在变量中。

var someFunction = function(x){
   console.log(x*x);
};

someFunction(5);
someFunction(6);

如果你真的想让它成为一个立即调用的函数表达式(iife),你可以让函数返回。

(function(x){
   console.log(x*x);
   return arguments.callee;
})(5)(6);

答案 1 :(得分:1)

我会说你可以做得很好:

var f = function(x) {
    console.log(x**x);
    return f;
};

f(5)(6)(7);

请参阅此处查看工作示例:

http://jsfiddle.net/9qAgr/

现在,我将授予您,上面不是真正的匿名函数,因为我有点给它一个名字(f);所以,如果你的字面意思是:“是否有可能在没有任何方式回顾函数本身的情况下这样做?”那我怀疑了。虽然我可能只是缺乏想象力;)


你真的可以拥有更多的乐趣(如果你是一个像我一样的书呆子,你可能就是因为你在这个网站上),通过定义一个在保持状态的同时返回自己的功能,谢谢JavaScript为函数添加属性的能力:

function createCalculator(operation) {
    var result = 0;

    var calculator = function(x) {
        result = operation(x, result);
        return calculator;
    };

    calculator.result = function() {
        return result;
    };

    return calculator;
};

var add = createCalculator(function(x, y) { return x + y; });

console.log(add(1)(2)(3)(4).result());

如果你想亲眼看看,这是一个演示:

http://jsfiddle.net/9qAgr/1/