2012-05-07 5 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)**