JavaScript 함수 표현식을 메모리에 유지하는 방법은 무엇입니까?

Nov 23 2020
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);

답변

5 sp00m Nov 23 2020 at 17:53

에서 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는 사용자 지정 출력을 표시하며 여기서 함수의 추론 된 이름을 표시합니다 (이름을 아는 것이 일반적으로 디버깅에 도움이되므로 의미가 있음).

3 RanjeetThorat Nov 23 2020 at 18:43

함수는 객체이므로 할당 x = y는 복사되지 않습니다. 나는이 Nodejs를 시도했다.

Bye
[Function: sayBye]

이름을 지정하지 않으면 함수 JS가 자동으로 이름을 추가합니다. ES6에서는 myFunction.name 을 사용하여 함수 이름을 확인할 수 있습니다 . 즉, 'name'은 함수 객체의 속성입니다. 중요한 것은 이것이 읽기 전용 속성 이라는 것입니다 . 좋은 방법은 함수 표현식 을 사용하는 const대신 사용하는 것입니다. let또한 가능하면 함수 디버깅이 호출 스택에서 쉽게 이름을 지정하십시오.

2 FZs Nov 23 2020 at 18:16

함수 이름으로 혼동합니다.

기억은 당신이 생각한 것과 똑같은 방식으로 발생합니다.

그러나 함수에 명시적인 이름이 없었기 때문에 브라우저는 함수에 암시 적 이름 , 즉 처음 할당 된 변수 또는 개체 속성의 이름 ( 이 경우 sayBye.

그런 다음 다른 변수에 할당되지만 이름은 변경되지 않습니다.

명시적인 이름을 지정하면이를 확인할 수 있습니다.

//  Explicit name ----vvvv
let sayBye = function myFn() {
    console.log(`Bye`);
}

let bye = sayBye;   
sayBye = null;    // X

bye();            // Y

console.log(bye);