2012-05-07 101 views
1

我已經搜索了JavaScript中的遞歸調用,但我想做一個「未命名」函數的遞歸調用。未命名函數的遞歸函數調用JavaScript

結果我發現使用谷歌是這樣

function foo() { 
    setTimeout("foo()",0); 
} 

,但我想打的東西,會是這樣:

(function() { alert(this.function) })() 

這可能嗎?

+0

內可用的是有一些原因,你不想給你的函數的名稱? –

回答

5

如果您不在strict mode中,則可以使用arguments.callee獲取功能對象,請參閱MDN文檔。例如

(function() { 
    console.log(typeof arguments.callee); // "function" 
    arguments.callee(); // call to itself 
})(); 

但作爲建議也有,你應該避免這種說法,並給予一個標識符的功能,像這樣

(function foo() { 
    foo(); // call to itself 
})(); 
0

據我所知,你不能。你必須有一個引用(名稱或變量)來回叫。

雖然有arguments.callee但它氣餒

注意:應避免使用arguments.callee的(),只是給每個功能(表達)的名稱。

0

基本上你正在尋找一種叫做Y-Combinator的東西(或者說維基百科把它放在了Fixed Point Combinator)。

本博客文章似乎給一個很好的介紹(只脫脂的,不知道我能解釋這一切......)

http://blog.jcoglan.com/2008/01/10/deriving-the-y-combinator/

var Y = function(f) { 
    return (function(g) { 
    return g(g); 
    })(function(h) { 
    return function() { 
     return f(h(h)).apply(null, arguments); 
    }; 
    }); 
}; 
var factorial = Y(function(recurse) { 
    return function(x) { 
    return x == 0 ? 1 : x * recurse(x-1); 
    }; 
}); 

factorial(5) // -> 120 

編輯: 我偷了從文章中,我不得不承認,我覺得真的很困惑,Y可能會讀更好的爲

var Y = function(f) { 
    var c1 = function(g) { 
     return g(g); 
    }; 
    var c2 = function(h) { 
     return function() { 
      return f(h(h)).apply(null, arguments); 
     }; 
    } 
    return c1(c2); 
}; 

而且從看它,我不知道這是一個它應該是簡單的。在javascript中定義一個定點組合器的最大缺點是你需要某種懶惰的評估,以便你的函數不會無限遞歸。在發佈簡化版本之前,我必須仔細考慮和/或重新閱讀文章。當然,我不確定這樣的事情會對你有多大幫助,尤其是性能方面。最容易理解(也許更高性能)的解決方案可能是像其他人所建議的那樣創建匿名塊,通常定義該函數並從該塊中返回。

0

可以傳遞函數的值,如果函數使用了一個名字:

setTimeout(function foo() { alert(foo); }); 
0

你不應該使用。被叫

你只是名稱的功能,這只是內部範圍

setTimeout(function namedFn(x) { 

    // namedFn() exists in here only (see notes below) 
    console.log('hello there ' + x); 

    if (!x || x < 10) { 
    namedFn(1 + x || 1); 
    } 

}, 5000); 

// namedFn() is undefined out here **(except for IE <= 8)**