2011-08-05 106 views
22

我可以編寫一個返回iteself的函數嗎?JavaScript函數可以自行返回嗎?

我正在讀的一些封說明 - see Example 6 - 在一個函數返回一個函數,所以你可以調用func()();爲有效的JavaScript。

所以我想可能一個函數返回本身,你可以把它鏈本身無限期這樣的方式:

func(arg)(other_arg)()(blah); 

使用arguments對象,被叫或主叫?

+0

相關問題:[Node.js上的Javascript FAB框架](http://stackoverflow.com/questions/3799238) – CMS

+0

http://stackoverflow.com/questions/6084872/an-object-that-returns-an-實例的-本身 http://stackoverflow.com/questions/1791793/javascript-function-call-to-itself – 2011-08-05 16:26:19

回答

25

有2-3種方法。正如你所說,其中一個就是使用arguments.callee。這可能是唯一的辦法,如果你與這不是存儲在分配給一個變量某處的匿名函數處理(你知道的):

(function() { 
    return arguments.callee; 
})()()()().... ; 

第2是使用該函數的名稱

function namedFunc() { 
    return namedFunc; 
} 
namedFunc()()()().... ; 

最後一個是使用一個匿名函數分配給一個變量,但你必須知道變量,所以在那種情況下,我沒有看到任何理由,爲什麼你不能給這個函數一個名字,並且使用方法以上

var storedFunc = function() { 
    return storedFunc; 
}; 
storedFunc()()()().... ; 

它們在功能上完全相同,但是callee是最簡單的。

編輯:我同意SLaks;我不能建議要麼

+8

值得注意的是'arguments.callee'在ES5中引發錯誤嚴格http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ –

+1

@abbotto方法3對我來說很好,但是的方法2是做到這一點的「正確」方式。至於棄用,請注意,這個答案是5歲 – Flambino

+2

@Flambino,你是對的。 方法1:通常應該完全避免,因爲arguments.callee已被棄用。請參閱:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee 方法2:這是在JS中執行遞歸函數調用的最佳方法,因爲函數不是匿名的,它的名字將顯示在堆棧跟蹤中。 – abbotto

11

是的。
只是return arguments.callee;


然而,這可能導致非常混亂的代碼;我不推薦它。

+5

我只想命名功能,而不是使用'arguments.callee'的原因有兩個:1 。函數通常通過實現進行優化,如果你不使用'arguments'對象,它通常不會被創建(執行上下文將被更快地初始化) - 當然,如果函數使用'eval',它通常可以不會被優化。 2.'arguments'對象在ES5嚴格模式下發生了變化,並且'arguments.callee'屬性已被禁止(同樣也出於優化和安全考慮),所以基本上要編寫* future-proof *代碼,我會推薦只是命名該功能。 :) – CMS

+0

@CMS:你確定'callee'不再被允許嗎?我認爲這是'來電者'。 – SLaks

+1

都是不允許的,調用者AFAIR實際上並不是規範的一部分,但它被很多實現支持,這就是爲什麼在ES5上,對於嚴格的函數,'caller'和'callee'都被分配給一個[thrower函數](http://es5.github.com/#x13.2.3),請參見[10.6參數對象](http://es5.github.com/#x10.6)中的*步驟14 * – CMS

1

有一個簡單的方法來實現這一目標做了以下內容:

let intArr = []; 
function mul(x){ 
    if(!x){ 
     return intArr.reduce((prev, curr) => prev * curr) 
    } 
    intArr.push(x); 
    return mul; 
} 

console.log(mul(2)(4)(2)()); => outputs 16 
0

也可能只是返回參數自身可調用的函數一樣

console.log((function(a) { return a; })(1)); // returns 1