我可以編寫一個返回iteself的函數嗎?JavaScript函數可以自行返回嗎?
我正在讀的一些封說明 - see Example 6 - 在一個函數返回一個函數,所以你可以調用func()();
爲有效的JavaScript。
所以我想可能一個函數返回本身,你可以把它鏈本身無限期這樣的方式:
func(arg)(other_arg)()(blah);
使用arguments
對象,被叫或主叫?
我可以編寫一個返回iteself的函數嗎?JavaScript函數可以自行返回嗎?
我正在讀的一些封說明 - see Example 6 - 在一個函數返回一個函數,所以你可以調用func()();
爲有效的JavaScript。
所以我想可能一個函數返回本身,你可以把它鏈本身無限期這樣的方式:
func(arg)(other_arg)()(blah);
使用arguments
對象,被叫或主叫?
有2-3種方法。正如你所說,其中一個就是使用arguments.callee
。這可能是唯一的辦法,如果你與這不是存儲在分配給一個變量某處的匿名函數處理(你知道的):
(function() {
return arguments.callee;
})()()()().... ;
第2是使用該函數的名稱
function namedFunc() {
return namedFunc;
}
namedFunc()()()().... ;
最後一個是使用一個匿名函數分配給一個變量,但你必須知道變量,所以在那種情況下,我沒有看到任何理由,爲什麼你不能給這個函數一個名字,並且使用方法以上
var storedFunc = function() {
return storedFunc;
};
storedFunc()()()().... ;
它們在功能上完全相同,但是callee
是最簡單的。
編輯:我同意SLaks;我不能建議要麼
值得注意的是'arguments.callee'在ES5中引發錯誤嚴格http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ –
@abbotto方法3對我來說很好,但是的方法2是做到這一點的「正確」方式。至於棄用,請注意,這個答案是5歲 – Flambino
@Flambino,你是對的。 方法1:通常應該完全避免,因爲arguments.callee已被棄用。請參閱:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee 方法2:這是在JS中執行遞歸函數調用的最佳方法,因爲函數不是匿名的,它的名字將顯示在堆棧跟蹤中。 – abbotto
是的。
只是return arguments.callee;
然而,這可能導致非常混亂的代碼;我不推薦它。
我只想命名功能,而不是使用'arguments.callee'的原因有兩個:1 。函數通常通過實現進行優化,如果你不使用'arguments'對象,它通常不會被創建(執行上下文將被更快地初始化) - 當然,如果函數使用'eval',它通常可以不會被優化。 2.'arguments'對象在ES5嚴格模式下發生了變化,並且'arguments.callee'屬性已被禁止(同樣也出於優化和安全考慮),所以基本上要編寫* future-proof *代碼,我會推薦只是命名該功能。 :) – CMS
@CMS:你確定'callee'不再被允許嗎?我認爲這是'來電者'。 – SLaks
都是不允許的,調用者AFAIR實際上並不是規範的一部分,但它被很多實現支持,這就是爲什麼在ES5上,對於嚴格的函數,'caller'和'callee'都被分配給一個[thrower函數](http://es5.github.com/#x13.2.3),請參見[10.6參數對象](http://es5.github.com/#x10.6)中的*步驟14 * – CMS
你可以做你想做的如下:
// Do definition and execution at the same time.
var someFunction = (function someFunction() {
// do stuff
return someFunction
})();
console.log(someFunction)
arguments.callee沒有在JavaScript嚴格模式的支持。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
有一個簡單的方法來實現這一目標做了以下內容:
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
也可能只是返回參數自身可調用的函數一樣
console.log((function(a) { return a; })(1)); // returns 1
相關問題:[Node.js上的Javascript FAB框架](http://stackoverflow.com/questions/3799238) – CMS
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