는 이유는 무엇이며 이를 인수입니다.수신자.발신자의 속성에서는 사용되지 않 JavaScript?
-
01-07-2019 - |
문제
왜였 arguments.callee.caller
속에서는 사용되지 않 JavaScript?
그것에 추가 되었고 그 후에서는 사용되지 않 자바스크립트,하지만 그것은 모두 생략하여 ECMAScript.일부 브라우저(Mozilla,IE)항상 그것을 지원하고 있지 않는 모든 계획 맵에서 제거할을 지원합니다.다른 사람(사파리,오페라)채택에 대한 지원이지만,그것을 지원 이전 버전의 브라우저에서 신뢰할 수 있습니다.
은 거기에 좋은 이유를 넣고 소중한 기능이 저승에서?
(거나 또는,더 좋은 방법이 있을 잡아 처리에서 호출 기능이?)
해결책
초기 버전의 자바 스크립트의 허용하지 않았다라는 기능을 표현,그리고 그 때문에 우리는 수 없습을 재귀적 기능 expression:
// This snippet will work:
function factorial(n) {
return (!(n>1))? 1 : factorial(n-1)*n;
}
[1,2,3,4,5].map(factorial);
// But this snippet will not:
[1,2,3,4,5].map(function(n) {
return (!(n>1))? 1 : /* what goes here? */ (n-1)*n;
});
이러한 문제를 해결하기 위해 arguments.callee
추가되었다 그래서 우리가 할 수 있습니다.
[1,2,3,4,5].map(function(n) {
return (!(n>1))? 1 : arguments.callee(n-1)*n;
});
그러나 이제 정말 나쁜 솔루션으로 이러(과 함께 다른 인수,수신자,발신자 문제)들에게 인라인하고 꼬리 재귀가 불가능한 일반적인 경우에는(당신이 그것을 달성할 수 있에서 선택한 경우 추적을 통해 등,하지만 최고의 코드가 최적의로 인해 확인하지 않은 필요).다른 주요 문제는 재귀화 상황을 만들 수 있습니다 this
값이,예를 들어:
var global = this;
var sillyFunction = function (recursed) {
if (!recursed)
return arguments.callee(true);
if (this !== global)
alert("This is: " + this);
else
alert("This is the global");
}
sillyFunction();
어쨌든,EcmaScript3 러한 문제를 해결했을 허용하여된 기능을 표현,예를 들어:
[1,2,3,4,5].map(function factorial(n) {
return (!(n>1))? 1 : factorial(n-1)*n;
});
이것은 수많은 장점:
이 함수를 호출할 수 있는 다른 내부에서 당신의 코드입니다.
이를 오염시키지 않는 네임스페이스가 있습니다.
의 가치
this
변경되지 않습니다.그것은 더 성능이 뛰어(에 액세스 인수를체 비싼).
차,
는 이외에 다른 모든 질문에 대한 arguments.callee.caller
, 거나,좀 더 구체적으로 Function.caller
.
에서 어떤 시점에 당신을 찾을 수 있습니다 가장 깊은 호출자의 모든 기능에 스택,그리고 위에서 말한 대로,호출 스택 보기 있는 하나의 주요 효과:그것은 많은 최적화를 불가능하거나,많은 훨씬 더 어렵습니다.
예를 들어.만약 우리가 보장 할 수 없는 함수 f
지 않을 것이 전화에 알 수 없는 함수,다음이 가능하지 않는 인라인 f
.기본적으로 그것이 의미하는 모든이 호출되었을 수 있는 사소 inlinable 축적 많은 수의 경비,취:
function f(a, b, c, d, e) { return a ? b * c : d * e; }
는 경우 js 통역을 보장할 수는 없습니 제공된 모든 인수들은 숫자를 지점에서는 통화가 만들어진,그것은 필요하거나 삽입 확인에 대한 모든 인수하기 전에 인라인 코드,또는 그 인라인을 할 수 없습니다.
지금 이 특정한 경우에는 스마트 통역을 할 수 있어야를 다시 정렬을 확인 최적의 확인하지 않는 모든 값을 사용하지 않기로 했습니다.그러나 많은 경우에는 가능하지 않고,따라서 그것은 불가능하게 인라인 요소입니다.
다른 팁
arguments.callee.caller
가 지 사용되지 않는,비록 그것의 사용 Function.caller
을 제공합니다.(arguments.callee
니다 그냥 당신에게 참조하여 현재의 함수)
Function.caller
, 지만,비표준에 따라 ECMA3,구현서 현재의 모든 주요 브라우저.arguments.caller
가 고 사용Function.caller
, 및 구현되지 않습에서부터 현재의 주요 브라우저(예.Firefox3).
그래서 상황은 보다 이상적인,하지만 액세스하려는 경우 호출한 자바 스크립트 함수에서 모든 주요 브라우저를 사용할 수 있습니다 Function.caller
성,액세스 중 하나에 직접 이라는 기능을 참조하거나 내부에서 익명의 기능을 통해 arguments.callee
을 제공합니다.
단지 확장자."값이"중 변경 사항을 재귀.다음(수정)를 들면,계승을 가져옵{"foo":true}object.
[1,2,3,4,5].map(function factorial(n) {
console.log(this);
return (!(n>1))? 1 : factorial(n-1)*n;
}, {foo:true} );
요인이라는 처음 개체를 가져옵니다,하지만 이것은 사실이 아닙니다 확장한다.