본문 바로가기

컴퓨터

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);
스 니펫 확장
자바 스크립트
공유 이 질문을 개선 따르다
편집 된 시간 5 분 전

Cid
12.6k4골드 배지 4 개2121 개의 은색 배지42청동 휘장 42 개
질문 : 57 분 전에

Mesut Çifci
574브론즈 배지 4 개

Chrome은 이것을 표시하지 않습니다. 공유 한 스 니펫이 정확합니까? 당신은, 당신은 함수의 이름을하지 않았다 확인 즉, 수 function sayBye() {대신 function () {첫 번째 줄에? – sp00m 55 분 전
현재 함수 생성되지 것 없이 이름을, 어떤 sayBye되어 있지 복사, 할당은 x = y복사되지 않습니다. – jonrsharpe 53 분 전
2
오 잠깐, 방금 Firefox에서 시도했는데 함수 이름이 대신 표시되는 것으로 표시 sayBye됩니다 ... 이상합니다! – sp00m 53 분 전
의견을 추가하다
3 개의 답변

2

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

공유 이 답변을 개선 따르다
편집 됨 24 분 전
50 분 전에 답변 함

sp00m
42.8k2222 개의 골드 배지121은색 배지 121 개227브론즈 배지 227 개
의견을 추가하다

1

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

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

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

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

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

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

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

bye(); // Y

console.log(bye);
스 니펫 확장
공유 이 답변을 개선 따르다
답변 27 분 전

FZ
10.2k11골드 배지 11 개2727 개의 은색 배지40브론즈 배지 40 개
의견을 추가하다

0

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

Bye
[Function: sayBye]

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