Skip to content
solheee

210310 - 객체, Pribitive & Reference, Scope

TIL, JS1 min read


코플릿

코플릿 풀다가 if문 안에 !key in obj 이렇게 적으니까 안되따!~!

key in obj === false 값을 검사하고 싶을 때는

!(key in obj)이렇게 괄호로 감싸주면 된다


원시 자료형과 참조 자료형

원시 자료형 같은 경우 값 자체에 대한 변경이 불가능하지만, 변수에 다른 데이터를 할당 할 수 있다.

stack과 heap

원시 자료형은 stack에,

참조 자료형은 heap에 저장된다


Scope

Scope란 변수 접근 규칙에 따른 유효 범위이다

  • 프로그래밍 언어는 각각의 변수 접근 규칙을 갖고 있다
  • 변수와 그 값이 어디서부터 어디까지 유효한지 판단하는 범위
  • 자바스크립트는 기본적으로, 함수가 선언되는 동시에 자신만의 Scope를 가진다

Local Scope와 Global Scope의 차이

  • Local Scope에서는 바깥 변수/함수에 접근하는 것이 가능하다.
  • Global Scope에서는 Local Scope 안에 있는 변수/함수에 접근하는 것이 불가능
1let greeting = "Hello";
2function greetSomeone() {
3 let fistName = "Josh";
4 return greeting + " " + firstName;
5}
6greetingSomeone(); // => "Hello Josh"
7firstName; // => ReferenceError

함수 안(Local Scope)에서 선언된 변수는 영역 밖에서 사용할 수 없다


  • Scope는 중첩이 가능하다
    • 함수 안에 함수를 넣을 수 있다.
  • Global Scope는 최상단의 Scope로, Global Scope에서 정의된 변수(전역 변수)는 어디서든 접근이 가능하다
  • 지역 변수(Local Scope)는 함수 내에서 전역 변수보다 더 높은 우선순위를 가진다.
1let name = "Richard";
2function showName() {
3let name = "Jack"; // 지역 변수
4 console.log(name);
5}
6console.log(name); // Richard
7showName(); // Jack
8console.log(name); // Richard

위 코드에서 ✅ 부분에 선언된 변수들은 서로 다른 변수이다. (전역 변수, 지역 변수)

지역 변수가 전역변수보다 더 높은 우선순위를 가지기 때문에, 함수를 실행하면 함수 안에서 실행된console.log(name)에 name부분에 지역변수를 가져온다


Function Scope와 Block Scope의 차이

Block 은 중괄호로 시작하고, 끝나는 단위이다.

1if (true) {
2 // Block
3}
4for (;;) {
5 // Block
6}
7
8{
9 // Block
10}

var vs let

  • var은 함수 스코프를 따른다
  • let은 Block 단위 ,,,?
1for (let i = 0; i < 5; i++) {
2 console.log(i);
3}
4console.log("final i:", i); // => Error
1for (var i = 0; i < 5; i++) {
2 console.log(i);
3}
4console.log("final i:", i); // => 5

..??

1function greetingSomeone(firstName) {
2 var time = "night";
3 if (time === "night") {
4 var greeting = "Good Night";
5 }
6
7 return greeting + " " + firstName;
8}
9
10greetingSomeone("Steve"); // => Good Night Steve

var 키워드를 사용해 변수를 선언할 경우 if문 안에서 변수를 선언해도 함수단위의 스코프에 정의되게 된다.

즉 if 문 밖 || 함수 스코프 안에서 변수를 불러와도 에러가 나지 않는다.

만약 var 키워드를 let으로 바꾼다면 변수는 if문 안 Block Scope에 한정되어 있기 때문에 위와 같이 if문을 빠져나와 변수를 호출하면 에러가 난다.

var은 그냥 쓰지말자...

+const 키워드

  • 값이 변하지않는 변수, 즉 상수
  • let과 같이 Block Scope를 따른다.
  • 값을 재정의하면 TypeError

전역 범위를 대표하는 객체 window

Global Scope에서 선언된 함수, var키워드를 이용해 선언된 변수는 window객체와 연결된다.

1let hi = "하이"; // window 객체에 연결되지 않음
2var bye = "바이"; // window 객체에 연결 됨!
3function hello() {
4 console.log("헬로");
5} // window 객체에 연결!!!

전역 범위에 너무 많은 변수를 선언하지 않도록 주의