2012-07-10 44 views
3

我想定義一個自動執行的匿名函數,但是它使用不同的參數運行幾次。是否可以執行兩次匿名函數?

(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) 
+0

簡答:沒有。我會做出更長的回答。 – Halcyon 2012-07-10 23:32:05

+1

爲什麼它必須是匿名的?對功能進行引用是否是一個問題? – freakish 2012-07-10 23:32:48

回答

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); 
+0

'arguments.callee'確實比命名函數更兼容。 +1(N.B.嘗試訪問'arguments.callee'將在嚴格模式下失敗,但這與此處不相關 - 也許只是對未來觀衆的警告。) – 2012-07-10 23:48:22

+0

在嚴格模式下是否有替代'arguments.callee'的選項? – 2012-07-10 23:51:47

+0

@BillyMoon關於arguments.callee的一篇有趣的文章,可以進一步告訴未來的讀者:https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee – dqhendricks 2012-07-10 23:56:03

1

我說你可以做到這一點就好了:

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

f(5)(6)(7); 

看到這裏的工作示例:

現在

,我就滿足你,上面是不是真的,我有點給它一個名稱(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/

相關問題