JavaScript에서 재귀 호출을 검색했지만 "이름이없는"함수의 재귀 호출을 만들고 싶습니다.이름없는 함수의 재귀 함수 호출 JavaScript
결과는 내가 구글이
function foo() {
setTimeout("foo()",0);
}
같은 것입니다 사용 찾을 내가 좋아하는 것이 무엇인가 만들고 싶어 :
(function() { alert(this.function) })()
이 가능를?
JavaScript에서 재귀 호출을 검색했지만 "이름이없는"함수의 재귀 호출을 만들고 싶습니다.이름없는 함수의 재귀 함수 호출 JavaScript
결과는 내가 구글이
function foo() {
setTimeout("foo()",0);
}
같은 것입니다 사용 찾을 내가 좋아하는 것이 무엇인가 만들고 싶어 :
(function() { alert(this.function) })()
이 가능를?
strict mode
에 있지 않은 경우 arguments.callee
으로 함수 개체를 가져올 수 있습니다 (MDN 문서 참조). 예 :
(function() {
console.log(typeof arguments.callee); // "function"
arguments.callee(); // call to itself
})();
그러나도 제안,이 문을 피해야한다 그래서
(function foo() {
foo(); // call to itself
})();
지금까지 내가, 당신은 할 수 없습니다 알고있는 것처럼, 함수에 식별자를 제공합니다. 다시 호출하려면 참조 (이름 또는 변수)가 있어야합니다.
이 arguments.callee
이지만이
참고 낙담 비록 : 당신은 arguments.callee를()를 사용하지 그냥 모든 기능 (표현)의 이름을 제공해야합니다.
기본적으로 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에서 고정 점 결합자를 정의하는 가장 큰 단점은 함수가 무한히 반복되지 않도록 일종의 지연 평가가 필요하다는 것입니다. 간략한 버전을 게시하려면 먼저 생각하고 기사를 다시 읽어야합니다. 물론, 나는 이것이 당신에게 어떤 도움이 될 것인지, 특히 성과가 현명한 것인지 잘 모르겠습니다. 다른 사람들이 제안한 것처럼 익명 블록을 생성하고 함수를 정상적으로 정의한 다음 블록에서 반환하는 것이 아마도 가장 쉬운 해결책 일 것입니다. 값으로 기능을 전달할 때당신은 함수의 이름을 사용할 수 있습니다 사용해서는 안
setTimeout(function foo() { alert(foo); });
.수신자
당신은 당신이 함수의 이름을주고 싶어하지 않는 일부 이유가 내부 범위
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)**
내부에서만 사용할 수있는 기능을 이름? –