는 이유는 무엇이며 이를 인수입니다.수신자.발신자의 속성에서는 사용되지 않 JavaScript?

StackOverflow https://stackoverflow.com/questions/103598

  •  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 을 제공합니다.

를 사용하는 것이 좋 라는 기능 이 인수입니다.수신자:

 function foo () {
     ... foo() ...
 }

보다 더

 function () {
     ... arguments.callee() ...
 }

명명된 함수에 대한 액세스 권한이 있고자를 통해 객실:

 function foo () {
     alert(foo.caller);
 }

는 것보다 낫다

 function foo () {
     alert(arguments.callee.caller);
 }

사용 중단으로 인해 현재 ECMAScript 디자인 원칙.

단지 확장자."값이"중 변경 사항을 재귀.다음(수정)를 들면,계승을 가져옵{"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}     );

요인이라는 처음 개체를 가져옵니다,하지만 이것은 사실이 아닙니다 확장한다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top