자바스크립트 함수 동작방식 질문드립니다.

자바스크립트 함수 동작방식 질문드립니다.

작성일 2024.02.04댓글 1건
    게시물 수정 , 삭제는 로그인 필요

1. 실행결과 aaa가 찍힘

2. 실행결과 에러 발생, 1번과 차이점,괄호연산자 안에 함수 작성

3. 실행 결과 aaa 찍힘, 함수명있음 괄호연산자 안에 함수작성함 뒤에 () 붙여줌

4. 실행 결과 aaa 찍힘, 함수명없음 괄호연산자 안에 함수작성함 뒤에 () 붙여줌

5. 코드 실행 결과 에러 발생, 함수명 명시하지않음

자바스크립트 공부 중 각각의 함수가 다르게 작동하는것을 확인하여 궁금하여 질문드립니다.

자바스크립트에서 함수명은 함수 내부에서만 호출가능한것으로 알고있습니다.

1번 예시의 경우 자바스크립트 엔진에서 암묵적으로 식별자를 생성해준다고 학습하였습니다.
그림과 같이 메모리 공간을 확보해 함수 객체가 저장된 메모리 주소와 함수객체가 메모리 상에 있는것으로 보입니다. 자바스크립트 엔진에서 암묵적으로 함수 이름과 같은 식별자를 생성하여, 식별자의 참조값으로 함수객체가 저장된 메모리 주소가 할당되며, 식별자명을 통해 함수 호출을 하게되는 것으로 이해하였습니다.

2번 예시의 경우 괄호연산자(...) 안에 함수를 작성하여 함수 호출 시 함수가 정의되지않았다는 에러가 찍히게됩니다. 함수명은 함수 내부에서만 호출가능한 것인데, 함수 외부에서 호출을 시도하여 에러가 찍히는것으로 보입니다. 즉, 식별자가 없어서 호출을 못하는 것으로 보이는데, 괄호연산자(....)안에 함수를 작성할 경우 함수객체를 위한 메모리 공간을 확보하고 참조값도 생성하지만, 식별자를 암묵적으로 생성해주진않는건가요? 1번 예시와 괄호연산자(...)에 함수를 작성한 것만 다른데 이렇게 동작되는 이유가 궁금합니다.

3번 예시의 경우 즉시실행함수를 사용하여 2번 코드에서 마지막 호출()만 붙여준 차이점 밖에 없습니다. 하지만 함수가 정상적으로 호출되는것을 확인하였습니다. 3번의 경우 함수객체를 위한 메모리 공간을 확보하여 함수객체를 만들고 참조값을 위한 메모리 공간도 확보하여 최종적으로 식별자가 함수객체 저장된 메모리 주소를 참조해 test()를 호출하는 원리인가요? 일반함수의 호출 원리와는 다른것 같아, 어떤 원리로 함수가 호출되고 실행결과가 나오는지 궁금합니다.
1,2번의 예시의 그림처럼 그림을 포함한 설명이 가능하다면 그림포함 설명을 해주셨으면 감사하겠습니다.

4번 예시의 경우 익명함수로 즉시실행을 하였을 경우 함수명이 없어 자바스크립트 엔진에서 함수객체 생성은 하지만, 식별자는 생성하지않아 호출을 못할것으로 생각되었습니다. 하지만 코드실행결과 정상적으로 함수 호출이되었습니다. 이 경우 참조값을 할당한 식별자도 없을거로 생각되는데, 함수객체가 저장된 메모리 주소를 어떻게 찾아서 함수객체가 저장된 메모리에 접근하는지 궁금합니다.
1,2번의 예시의 그림처럼 그림을 포함한 설명이 가능하다면 그림포함 설명을 해주셨으면 감사하겠습니다.
5. 4번 예제와 비교를 위해 익명함수를 그냥 선언했을 경우는 함수 이름이 없어 에러가 떳습니다.
4번 예시의 경우도 함수이름은 없지만 함수객체가 생성되어서 호출된것으로 보이는데, 5의 경우 괄호연산자(...)를 쓰지않고 익명함수를 선언하여 함수객체 자체가 메모리에 올라가지않은것으로 추측하고있습니다. 4번 예시의 경우와 5번 예시의 경우 괄호연산자(...)안에 함수를 선언, 함수호출을 위한()를 코드 마지막에 추가해준것만 다른것으로 보이는데 왜 5번에서는 에러가나고 4번에서는 정상적으로 호출되는지 궁금합니다. 1,2번의 예시의 그림처럼 그림을 포함한 설명이 가능하다면 그림포함 설명을 해주셨으면 감사하겠습니다.

1번 예시의 그림



2번 예시의 그림



#자바스크립트 함수 #자바스크립트 함수 선언 #자바스크립트 함수 종류 #자바스크립트 함수 호출 #자바스크립트 함수 실행 순서 제어 #자바스크립트 함수형 프로그래밍 #자바스크립트 함수 표현식 #자바스크립트 함수 호출 안됨 #자바스크립트 함수 안에 함수 #자바스크립트 함수 return

profile_image 익명 작성일 -

잘 공부하고 계시네요~ 다음 두가지만 다시 생각해보면서 공부해보시면 좋을 것 같습니다.

- js 함수 선언에 소괄호를 붙이면 특별하게 함수 표현식이 됩니다. 그리고 독립적인 스코프를 가집니다.

- 함수는 식별자 없이도 호출할 수 있습니다.

2번의 경우

  1. (function bar() {console.log('aaa')});

함수 선언이 아닌 함수 표현식이 되었으며 독립적인 스코프를 가지므로 외부에서 bar 식별자로 접근하지 못합니다.

3번의 경우

  1. (function test() {console.log('aaa')}());

(function test() {console.log('aaa')})의 결과로 함수는 생성되어 메모리에 있습니다. 그리고 표현식이기 때문에 함수값을 반환합니다. 이 값은 함수 그 자체이므로 ()로 호출할 수 있습니다.

(function test() {console.log('aaa')})() -> (평가된 함수)() -> 실행

4번의 경우

  1. (function() {console.log('aaa')}());

이런 형태로는 잘 안쓰이긴 합니다만 3번과 동일합니다. 소활호때문에 선언문이 표현식이 되었고 즉시 호출한 모습입니다.

5번의 경우

  1. function() {}

표현식이 아닌 선언문에 함수 이름은 필수입니다. 4번은 표현식이라 괜찮습니다.

결론

- 함수 호출에 식별자는 꼭 필요하진 않다

- 스코프, 표현식, 함수 선언문, 함수 표현식 공부하기

함수 선언 방법에 대해 질문드립니다

... 무슨 방식이고 어떤 장점을 갖고있나요?? 자바와 자바스크립트는 다른 언어입니다. 자바스크립트에 대한 질문으로 이해하고 답변 드리겠습니다. 예시로 "$.함수명...

자바 스크립트 함수 질문입니다!

자바 스크립트함수 부분이 잘 이해가... signOut는 비동기로 동작하는 Promise의 then이 실행될때... 추천드립니다~! 도움되셨다면 채택 부탁드립니다...

자바스크립트 함수 질문합니다.

... setTimeout 함수가 비동기 함수이고 1초 후에... 의도대로 동작하게 하려면 다음과 같은 방법이... 넘기는 방식입니다. setTimeout 에 전달된 캡쳐...

자바스크립트 함수와 클로저에 대해서

... d1id=1&dirId=1040202&docId=396537705 아까 이 질문을... 일반적인 함수 선언방식이랑은 다른건가요?? 첨에... 것처럼 동작도 다릅니다. // 1 addNum = function() { var x...

JSP에서 자바스크립트함수에...

좌석예약 프로그램을 위해서 자바스크립트로... 질문1. 여기에서 보면 rv(v)함수가 셀 클릭시 예약이... 답변 부탁드립니다. 꾸벅.. 현재남은 전체좌석 function rv...

자바스크립트 질문 있습니다!

... 시 자바 스크립트 이벤트가 시작되도록 코딩 해놨는데요... getElementById("IDX") 방식은 쓰지 못하고 있습니다! 답변 부탁드립니다! id는 document에서...