자바스크립트 2일차 정리

이건준·2022년 3월 15일
0

문제제기

자바스크립트에 대한 기본적인 문법에 대해서 알아보자

문제해결

Q. 일반적인 암묵적인 전역변수 예시


-> 자바스크립트에선 동적언어로 런타임에 타입이 결정되어진다, 그래서 앞서 1일차때 설명했듯이 모든 변수는 8바이트로 미리 메모리에 공간을 만든다고하였다

-> 위와 같은 이유로 굳이 타입을 쓰지않아도 x = 10은 콘솔에 잘 출력되는것을 확인할 수 있다

-> 헌데 이때 선언한 x라는 이름의 변수는 암묵적으로 전역변수이다

Q. function객체안에서의 암묵적인 전역변수 예시


-> 위 코드와 같이 function객체안에 y를 선언하여도 암묵적으로 전역변수이므로 다른 function객체인 k에서도 y를 사용가능하다

Q. 그럼 자바스크립트에서 변수를 선언하면 반드시 전역변수인가요 ??


-> 자바스크립트에선 var나 let(const)을 통해 변수인지 상수인지 정의할 수 있다

-> 위와 같이 var, let을 이용하여 선언할 경우엔 전역변수가 되지않는다

Q. 그럼 var나 let을 사용하지않고 암묵적인 전역변수를 적용시키지않는 방법은 없나요??


-> 위 코드처럼 use strict를 선언해주면 암묵적인 전역변수 룰이 적용되지않는다

-> 이 use strict를 선언해줄땐 함수의 선두나 변수앞에 선언해준다

Q. vscode안에서 this를 출력하면 ??



-> vscode안에 this라는 자기자신을 가리키는 키워드를 사용하게되면은 global이라는 전역객체가 콘솔창에 찍힌다

Q. 구글개발자도구에서 this를 출력하면 ??


-> 여기선 Window가 출력된다

-> 즉 node.js 실행환경에서 this는 global 전역객체, 웹 브라우저 실행환경에서 this는 Window객체인 것이다

-> 실행환경에 따라서 this가 다르다!!! 중요!!!

Q. 전역객체를 가리키면 만약에 use strict를 사용하면 어떻게 될까 ??


-> use strict를 선언하고 콘솔에 this를 찍으면 undefined가 찍히게 된다

-> 그리고 new f()를 통해서 f라는 함수객체를 만들어주고 그에 대한 this를 출력하면 f본인이 출력된다!!

-> f를 함수로써 호출할땐 this가 global전역객체였는데 객체로써 호출할땐 this가 본인 f네 ??

Q. 함수스코프 vs 블록스코프


-> 우리가 기본적으로 var로 선언한것은 함수스코프를 가지고 let으로 선언하는것은 블록스코프를 가진다

Q. 함수스코프가 뭐야 ??

-> 위 그림을 예시로 보면은 var로 선언한 foo같은 경우는 함수스코프이기때문에 초기에 var foo = 123에 의해서 foo가 생성이 되고 f라는 함수내에서 사용하는 모든 foo는 초기에 생성한 foo이기에 콘솔창에 변경된 456이 찍히는것을 볼 수 있다

-> 함수스코프는 함수내에선는 선언한 변수의 범위가 유효하다라는 의미 !!

-> var가 함수스코프인데 함수블록안에서는 지역변수로써 역할을 하고 나머진 전부 전역변수로써의 역할

Q. 블록스코프가 뭐야 ??

-> 이도 똑같이 let으로 let bar = 123으로 선언해주었다, 헌데 블록안에 let bar = 456을 선언해주었는데 이 let은 블록스코프를 갖기때문에 블록안에 있는 bar가 따로 있는것이고 즉 콘솔창에 찍힌 bar는 123을 출력하게된다

-> 블록스코프란 블록안에서는 선언한 변수의 범위가 유효하다라는 의미 !!

-> let과 const가 블록스코프인데 블록안에서는 지역변수로써 역할을 하고 나머진 전역변수로써의 역할

Q. var와 let의 또다른 차이점 ??


-> 위 코드에서 보이는것처럼 let은 중복선언이 불가하고 var중복선언을 해도 문제없다

Q. 자바스크립트는 아량이 넓은 언어 ??!!


-> 보통 위처럼 선언을 하게되면은 foo가 앞에 존재하지않기때문에 오류가 발생한다, 또한 일부 언어에선 선언부만 존재하면 오류를 일으키는것도 있다

-> 허나 자바스크립트에서는 위처럼 코드를 하여도 호이스팅이라는것때문에 선언부가 콘솔코드 앞으로 이동해주게되고 선언부만 코드되있는것 또한 자바스크립트에서 허용한다

-> undefined 즉 정의되지않는 이라는 의미를 가진 키워드가 출력된다

-> 즉 위 함수가 실행되기전에 모든 선언부가 위로 올라간다(호이스팅된다)

Q. 그럼 var나 let으로 선언해도 호이스팅될까 ??

-> 허나 var나 let을 선언해주지않은것은 호이스팅되지않는다, 오류 발생 !!

-> let과 const로 선언한 변수도 호이스팅 대상이지만, var와 달리 호이스팅 시 undefined로 변수를 초기화하지는 않습니다. 따라서 변수의 초기화를 수행하기 전에 읽는 코드가 먼저 나타나면 예외가 발생 !!

Q. 호이스팅이란 ???

-> 해당 function이나 블록이 실행되기전에 선언부만 올라오는것(호이스팅)

-> 이 호이스팅은 var든 let이든 const든 선언부만 호이스팅가능하지만 var는 undefined로 초기화되지만 let은 초기화되지않아 에러가 발생

Q. 그럼 const는 무슨 스코프에요 ??

-> const는 let과 동일하게 블록스코프를 가진다

-> 또한 const도 호이스팅이 가능하지만 초기화되지않아서 오류가 발생한다

Q. const는 주로 어떻게 사용되나요 ??


-> const는 주로 위 코드처럼 상수를 정의할때 사용한다, 그 이유는 const로 정의하면 가독성과 유지보수의 편의를 높여주기때문이다 !!


-> 두번째로 객체를 생성할때도 const를 자주 사용한다, 객체내용을 변경하긴해도 객체자체를 변경시킬일은 거의 없기때문에 !!

0개의 댓글