JavaScript 함수 표현식을 메모리에 유지하는 방법은 무엇입니까?
let sayBye = function () {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
이 질문을하기 전에 Google에서 검색 하여이 게시물을 찾았 습니다.
그런 다음 X 행 앞에 다음과 같은 구조가 있다고 생각했습니다.
sayBye ---------------
|
| => function() {....}
|
bye-------------------
x 라인 뒤에 다음과 같이 생각했습니다.
sayBye MEMORY
| => function() {....}
|
bye-------------------
하지만 파이어 폭스 개발자 도구에서 작별 인사를 썼을 때 이것을 보았습니다.

그게 어떻게 가능해? 내가 썼을 때 let bye = sayBye;
sayBye는 coppied입니까?
let sayBye = function () {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
console.log(bye);
답변
에서 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Inferred_function_names:
변수와 메서드는 구문 위치에서 익명 함수의 이름을 유추 할 수 있습니다 (ECMAScript 2015의 새로운 기능).
Chrome과 Firefox는 모두 "sayBye"
인쇄 할 때 제공 bye.name
합니다.
개인 실험에서 Chrome 콘솔 bye.toString()
은를 요청할 때 표시 bye
하고 Firefox는 사용자 지정 출력을 표시하며 여기서 함수의 추론 된 이름을 표시합니다 (이름을 아는 것이 일반적으로 디버깅에 도움이되므로 의미가 있음).
함수는 객체이므로 할당 x = y는 복사되지 않습니다. 나는이 Nodejs를 시도했다.
Bye
[Function: sayBye]
이름을 지정하지 않으면 함수 JS가 자동으로 이름을 추가합니다. ES6에서는 myFunction.name 을 사용하여 함수 이름을 확인할 수 있습니다 . 즉, 'name'은 함수 객체의 속성입니다. 중요한 것은 이것이 읽기 전용 속성 이라는 것입니다 . 좋은 방법은 함수 표현식 을 사용하는 const
대신 사용하는 것입니다. let
또한 가능하면 함수 디버깅이 호출 스택에서 쉽게 이름을 지정하십시오.
함수 이름으로 혼동합니다.
기억은 당신이 생각한 것과 똑같은 방식으로 발생합니다.
그러나 함수에 명시적인 이름이 없었기 때문에 브라우저는 함수에 암시 적 이름 , 즉 처음 할당 된 변수 또는 개체 속성의 이름 ( 이 경우 sayBye
.
그런 다음 다른 변수에 할당되지만 이름은 변경되지 않습니다.
명시적인 이름을 지정하면이를 확인할 수 있습니다.
// Explicit name ----vvvv
let sayBye = function myFn() {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
console.log(bye);