최근 JavaScript를 배우다가 발신자와 수신자에 문제가 발생하여 Baidu 온라인을 많이 방문했습니다. 찾은 내용은 모든 사람에게 큰 도움이 됩니다. 여러분과 공유하기 위해 정리하고 요약했습니다.
caller: 함수를 호출하는 함수에 대한 참조를 반환합니다. (사용법: function.caller)
참고: 함수의 경우 호출자 속성은 함수가 실행될 때만 정의됩니다. 함수가 최상위 수준에서 호출되면 호출자는 null입니다.
var time = 3 //控制次数,去掉会一直在caller与handleCaller交替不断执行 function caller() { caller.caller()//返回调用caller函数的函数引用 } function handleCaller() { if (time > 0){ time-- alert(handleCaller.caller)//返回调用handleCaller函数的函数引用 alert(caller.caller)//返回调用caller函数的函数引用 caller() } } handleCaller()
분석 예: 처음으로 handlerCaller를 실행하면 두 경고 모두 null을 반환합니다. 경보(handleCaller.caller)는 최상위 수준에서 호출되기 때문에 null을 반환하고, 호출자가 기본값이므로 경고(caller.caller)는 null을 반환합니다. 값이 null입니다. 다음으로 caller() 함수가 호출됩니다. caller.caller는 이를 호출한 함수(handleCaller)에 대한 참조를 반환합니다. handlerCaller 함수는 caller.caller()를 통해 다시 호출될 수 있습니다. handlerCaller가 두 번째로 실행되면, Alert(handleCaller.caller)는 호출자 코드(실제로는 호출자에 대한 참조)를 반환하고, Alert(caller.caller)는 handlerCaller 코드를 반환합니다. 함수 간의 호출 관계는 handlerCaller->caller->handleCaller이기 때문입니다. 그 후에는 계속해서 두 기능을 번갈아 사용하게 됩니다.
caller는 현재 함수를 호출하는 함수를 가리키지만 한 가지가 있습니다. 전역 범위(즉, 최상위 창)에서 호출하면 null이 반환됩니다.
코드 시작
==================== function testCaller(){ if(testCaller.caller == null){ console.log('accessed at global'); }else{ console.log('accessed at ' + testCaller.caller); } }
전 세계적으로 전화하세요
testCaller(); // accessed at global
호출
function a(){ testCaller(); } a(); // accessed at function a(){testCaller();}
이때 testCaller.caller는 함수를 가리킵니다
callee: 해당 인수의 함수 참조를 반환합니다. (주로 익명 함수 재귀에 사용됨)
참고: 아마도 인터넷에서 가장 많이 보는 것은 호출 수신자가 실행 중인 함수에 대한 참조를 반환한다는 것입니다. 이것이 제가 이해하는 방식입니다. 각 함수에는 일반적으로 매개변수를 저장하는 데 사용되는 자체 인수가 있습니다. 인수에는 피호출자 속성이 있으며 초기 값은 자신에 해당하는 함수 참조입니다. 함수가 이 명령문을 실행할 때 인수는 기본적으로 현재 실행 중인 함수에 해당하며,args.callee는 현재 실행 중인 함수에 대한 참조입니다. 물론, 다른 함수의 인수를 표시한 경우(예제에서는 args) 자연스럽게 args.callee()를 사용하여 해당 함수를 다시 호출할 수 있습니다.
function a(){ alert(arguments.callee) var args = arguments function c(){ alert(arguments.callee) args.callee() } c() } a()
분석 예: 예제의 인수.callee는 기본적으로 현재 실행 중인 함수에 대한 참조를 반환하고(a는 a의 자체 함수 참조를 반환하고, c는 c의 자체 함수 참조를 반환함) args를 사용하여 함수의 인수를 저장합니다. 함수 a를 다시 호출하려면 내장 함수 c에서 args.callee()를 사용하세요.
==================== function a(x){ if(x<=1) return x; else return x + a(x-1); } a(12) // 78
이것은 정상적인 결과를 나타내는 최소한의 재귀입니다.
아래 호출 방법을 살펴보세요
var b = a; a = null; // 将a回收 b(12); // erro : 'a' is not a function
이유도 간단합니다. b=a, b=function a(){}; b를 호출하기 전에는 a=null을 사용했습니다. 따라서 함수 a가 실행 중일 때 return x a(x-1);의 a는 함수 a가 아니라 null을 가리킵니다.
그래서 이 문제를 해결하는 방법에 대한 오류를 보고했습니다. a를 다른 방법으로 바꿔보자
function a(x){ if(x<=1) return x; else return arguments.callee(x-1); // 这句是改变的地方 }
다시 전화하세요
var b = a; a = null; b(12); // 78
이유: a=null로 설정했지만 a는 함수 a에서 사용되지 않고,args.callee를 통해 현재 함수를 가리킵니다.
Arguments.callee의 정의는 다음과 같습니다. 실행 함수를 반환합니다.