arguments.callee.caller 속성이 JavaScript에서 폐지된 이유는 무엇입니까?
왜?arguments.callee.caller
JavaScript에서 더 이상 사용되지 않는 속성?
JavaScript에서 추가되었다가 폐지되었지만 ECMAScript에 의해 완전히 생략되었습니다.일부 브라우저(Mozilla, IE)는 항상 이 기능을 지원하며 지도에서 지원을 제거할 계획이 없습니다.다른 회사(Safari, Opera)에서는 지원 기능을 채택하고 있지만 오래된 브라우저에서의 지원은 신뢰할 수 없습니다.
이 귀중한 기능을 보류해야 할 타당한 이유가 있습니까?
(혹은 호출 기능의 핸들을 잡는 더 좋은 방법이 있을까요?)
이전 버전의 JavaScript에서는 명명된 함수식을 허용하지 않았기 때문에 재귀 함수식을 만들 수 없었습니다.
// 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();
어쨌든 EcmaScript 3은 다음과 같은 명명된 함수 식을 허용함으로써 이러한 문제를 해결했습니다.
[1,2,3,4,5].map(function factorial(n) {
return (!(n>1))? 1 : factorial(n-1)*n;
});
여기에는 다음과 같은 이점이 있습니다.
이 함수는 코드 내부에서 다른 함수와 마찬가지로 호출할 수 있습니다.
네임스페이스를 오염시키지 않습니다.
가치
this
는 변경되지 않습니다.퍼포먼스가 향상됩니다(arguments 객체에 액세스하는 것은 비용이 많이 듭니다).
앗.
방금 깨달은 건 다른 모든 것들과 더불어 질문이arguments.callee.caller
, 또는 보다 구체적으로는.
언제든지 스택 상의 함수 중 가장 깊은 곳에 있는 발신자를 찾을 수 있습니다.앞서 설명한 바와 같이 콜스택을 조사하는 것은 하나의 큰 효과를 가져옵니다.따라서 많은 최적화가 불가능하거나 훨씬 더 어려워집니다.
예를 들어, 어떤 기능이f
알 수 없는 함수를 호출하지 않기 때문에 인라인화할 수 없습니다.f
기본적으로는 신뢰할 수 없는 콜사이트에 다수의 경비원이 축적되어 있는 것을 의미합니다.
function f(a, b, c, d, e) { return a ? b * c : d * e; }
js 인터프리터는 제공된 인수가 모두 콜이 발신된 시점에서 수치임을 보증할 수 없는 경우 인라인 코드 앞에 모든 인수에 대한 체크를 삽입해야 합니다.그렇지 않으면 함수를 인라인화할 수 없습니다.
이 경우 스마트 인터프리터는 체크를 보다 최적화하도록 재배치할 수 있어야 하며 사용되지 않는 값은 체크하지 않아야 합니다.그러나 대부분의 경우 이는 불가능하기 때문에 인라인화가 불가능합니다.
arguments.callee.caller
는 사용되지 않지만 속성을 사용합니다.(arguments.callee
현재 기능에 대한 참조만 제공합니다.)
Function.caller
ECMA3에 따르면 비표준이지만 현재 모든 주요 브라우저에 구현되어 있습니다.-
arguments.caller
을 위해 추천되지 않는다.Function.caller
파이어폭스 3)를 사용합니다.
이상적인에 액세스하려면 할 수 .Function.caller
arguments.callee
★★★★★★★★★★★★★★★★★★.
arguments.callee보다 이름 있는 함수를 사용하는 것이 좋습니다.
function foo () {
... foo() ...
}
보다 낫다
function () {
... arguments.callee() ...
}
명명된 함수는 발신자 속성을 통해 발신자에 액세스할 수 있습니다.
function foo () {
alert(foo.caller);
}
어느 쪽이 더 낫다
function foo () {
alert(arguments.callee.caller);
}
이러한 권고는 현재의 ECMAScript 설계원칙에 기인한다.
그냥 연장선이야."this" 값은 재귀 중에 변경됩니다.다음(수정된) 예제에서는 factor가 {foo:true} 개체를 가져옵니다.
[1,2,3,4,5].map(function factorial(n) {
console.log(this);
return (!(n>1))? 1 : factorial(n-1)*n;
}, {foo:true} );
처음 호출된 요인에서 개체를 가져오지만 재귀 호출의 경우 그렇지 않습니다.
언급URL : https://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript
'programing' 카테고리의 다른 글
PHP: array_map 함수로 인덱스를 가져올 수 있습니까? (0) | 2022.11.17 |
---|---|
__hash__()를 구현하는 올바르고 좋은 방법은 무엇입니까? (0) | 2022.11.17 |
MySql : 읽기 전용 옵션을 허용하시겠습니까? (0) | 2022.11.17 |
강조 표시/선택한 텍스트를 가져옵니다. (0) | 2022.11.17 |
fragment화 권한을 확인하는 방법 (0) | 2022.11.17 |