티스토리 뷰
필기시험을 볼 일이 있었다. 열심히 풀었으나 확인했더니 다 틀렸다! 하하하하하 😀 스코프와 호이스팅을 공부하는 시간을 가졌다!
콘솔에 출력되는 값은 무엇인가요?
Q1.
답 : 에러
a를 출력하면 function이 나오고 b를 출력하면 undefined가 나온다. 그러므로 b를 호출하면 에러가 발생한다.
함수 b는 함수 선언식이 아니라 함수 표현식으로 선언되었으므로 호이스팅이 일어나지 않았다. 또한 var로 선언했으므로 a가 호출될 때 b함수가 할당되므로 에러가 난다.
var a = function b() {
return 10;
};
console.log(typeof b()); // ReferenceError: b is not defined
이렇게 함수 선언식으로 함수를 선언하면 접근 가능하다.
function b() {
return 10;
}
console.log(typeof b()); // number
Q2.
답 : undefined
var x = 1, y = x = typeof y
console.log(y)
코드를 왼쪽부터 오른쪽으로 실행해서 number가 출력될 거라고 생각했는데 vscode에서 프리티어를 사용해 저장하면 형태를 이런 형태로 바꿔준다. y에 x를 할당하고 거기에 y의 타입을 할당하는게 아니라 y의 타입을 x에 할당한 뒤 그 값을 y에 할당한다.
하지만 y가 선언되기 전에 y의 타입을 호출했으므로 undefined이 되어 y에는 undefined이 할당된다.
var x = 1,
y = (x = typeof y);
console.log(y);
var를 사용한다면 알고 있어야하는 개념인 것 같다. 하지만 let을 쓰면 에러를 띄워주므로 문제는 없어보인다. 👀
let x = 1,
y = (x = typeof y);
console.log(y); // ReferenceError: Cannot access 'y' before initialization
Q3.
답 : undefined, 2
var는 선언과 할당이 별개로 이뤄지므로 호출시에는 호이스팅되어 선언만 끌어올려졌고 할당은 이뤄지지않아 undefined가 출력된다.
function a() {
console.log(b);
console.log(c());
var b = 1;
function c() {
return 2;
}
}
a();
b에 1을 할당하고 출력하면 잘 출력되는 것을 확인할 수 있다. 함수는 호이스팅되므로 2가 출력된다. 함수 안의 함수는 호이스팅이 일어나지 않는 줄 알았는데 일어난다.
function a() {
console.log(b); // undefined
console.log(c()); // 2
var b = 1;
console.log(b); // 1
function c() {
return 2;
}
}
a();
var는 함수 스코프를 가지기 때문에 c함수 안에서 호출하면 undefined가 출력된다.
function a() {
console.log(b); // undefined
console.log(c()); // undefined, 2
var b = 1;
function c() {
console.log(b);
return 2;
}
}
a();
Q4 - 1.
답 : park, undefined
obj.props.name은 닷노테이션으로 접근해서 park이 나온다.
var name = 'kim';
var obj = {
name: 'lee',
props: {
name: 'park',
getName: function () {
return this.name;
},
},
};
console.log(obj.props.getName());
Q4 - 2. test를 실행했을 때 park이 나오게 하려면 어떻게 해야하나요?
자바스크립트의 this는 실행 맥락에 따라 달라지기 때문에 test를 실행했을 때 this는 글로벌이고 this.name이 없기 때문에 undefined가 나온다. 그래서 test를 선언할때 bind함수로 this를 고정시켜 줄 수 있다.
obj.props.name까지 고정시켜줘야되는 줄 알았는데 그 상위 스코프까지만 엮어주면 되는 것 같다..!
var name = 'kim';
var obj = {
name: 'lee',
props: {
name: 'park',
getName: function () {
return this.name;
},
},
};
console.log(obj.props.getName());
// 기존
// var test = obj.props.getName.bind
var test = obj.props.getName.bind(obj.props);
console.log(test());
결론! let과 const를 쓰면 호이스팅과 스코프 문제가 복잡해질 일이 딱히 없는 것 같다! let const 최고! var를 지양하자!!!! 🔥
this는 헷갈렸는데 다시 정리하는 시간이 됐다.😀
'TIL' 카테고리의 다른 글
TIL 230310 리액트 라이프 사이클 (React Life cycle) (0) | 2023.03.10 |
---|---|
TIL 230308 객체지향 프로그래밍(OOP)과 함수형 프로그래밍(FP)은 무엇인가.. (0) | 2023.03.08 |
TIL 230228 좋은 git commit 메세지 적기 (0) | 2023.02.28 |
TIL 230209 최대공약수와 최소공배수 with Python (0) | 2023.02.09 |
TIL 230129 Redux action any 해결하기 in TS (Parameter 'action' implicitly has an 'any' type.) (0) | 2023.01.29 |
- Total
- Today
- Yesterday
- 제로초
- React
- Python
- 드림코딩
- 깃
- 스파르타코딩클럽
- git
- 김버그
- js
- 자바스크립트
- TS
- Typescript
- 저스트코드
- vscode
- 파이썬
- 제이쿼리
- 코드잇
- 타입스크립트
- html
- CSS
- 코딩앙마
- javascript
- 구름에듀
- 회고
- map
- scss
- 비주얼스튜디오코드
- 리액트
- vue
- Til
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |