3 回答

TA貢獻1866條經(jīng)驗 獲得超5個贊
使用命名函數(shù)表達式:
您可以為函數(shù)表達式指定一個實際上是私有的名稱,并且只有在函數(shù)內(nèi)部才能看到:
var factorial = function myself (n) {
if (n <= 1) {
return 1;
}
return n * myself(n-1);
}
typeof myself === 'undefined'
下面myself是該函數(shù)的可見里面只有自己。
您可以使用此私有名稱來遞歸調(diào)用該函數(shù)。
請參閱13. Function DefinitionECMAScript 5規(guī)范:
可以從FunctionExpression的FunctionBody內(nèi)部引用FunctionExpression中的標(biāo)識符,以允許該函數(shù)以遞歸方式調(diào)用自身。但是,與FunctionDeclaration中的功能不同,F(xiàn)unctionExpression中的Identifier不能從中引用,也不會影響包圍FunctionExpression的作用域。
請注意,版本8之前的Internet Explorer的行為不正確,因為該名稱實際上在封閉的變量環(huán)境中可見,并且它引用了實際功能的副本(請參見下面的patrick dw的注釋)。
使用arguments.callee:
或者,您可以arguments.callee用來引用當(dāng)前函數(shù):
var factorial = function (n) {
if (n <= 1) {
return 1;
}
return n * arguments.callee(n-1);
}
ECMAScript的第五版禁止在嚴(yán)格模式下使用arguments.callee(),但是:
(來自MDN):在常規(guī)代碼中arguments.callee指的是封閉函數(shù)。這個用例很弱:只需命名封閉函數(shù)即可!而且,arguments.callee實質(zhì)上阻礙了諸如內(nèi)聯(lián)函數(shù)之類的優(yōu)化,因為如果訪問arguments.callee,則必須使其能夠提供對未內(nèi)聯(lián)函數(shù)的引用。嚴(yán)格模式功能的arguments.callee是不可刪除的屬性,在設(shè)置或檢索時會拋出該屬性。

TA貢獻1806條經(jīng)驗 獲得超5個贊
您可以使用arguments.callee [MDN]來訪問函數(shù)本身:
if (counter>0) {
arguments.callee(counter-1);
}
但是,這將在嚴(yán)格模式下中斷。

TA貢獻1906條經(jīng)驗 獲得超10個贊
您可以使用Y-combinator:(Wikipedia)
// ES5 syntax
var Y = function Y(a) {
return (function (a) {
return a(a);
})(function (b) {
return a(function (a) {
return b(b)(a);
});
});
};
// ES6 syntax
const Y = a=>(a=>a(a))(b=>a(a=>b(b)(a)));
// If the function accepts more than one parameter:
const Y = a=>(a=>a(a))(b=>a((...a)=>b(b)(...a)));
您可以這樣使用它:
// ES5
var fn = Y(function(fn) {
return function(counter) {
console.log(counter);
if (counter > 0) {
fn(counter - 1);
}
}
});
// ES6
const fn = Y(fn => counter => {
console.log(counter);
if (counter > 0) {
fn(counter - 1);
}
});
添加回答
舉報