코드스테이츠 Checkpoint.3 (javascript koans)

박성훈·2022년 7월 13일
1

JavaScript

목록 보기
14/25
post-thumbnail

클로저 함수는 전역scope에서 호출되지 않는다.

function outerFn() {
      let age = 24;
      name = 'jimin';
      let height = 178;

      function innerFn() {
        age = 26;
        let name = 'suga';
        return height;
      }
    }

위의 함수의 경우는 outerFn의 내부함수로 innerFn이 선언된 상태이다.
이 때, innerFn을 Global scope에서 선언하게 되면

Uncaught ReferenceError: innerFn is not defined

선언되지 않았다는 에러메세지가 나온다.

그렇다면, 클로저함수를 전역scope에서 호출하고 싶으면 어떻게 해야할까?

function outerFn() {
      let age = 24;
      name = 'jimin';
      let height = 178;

      function innerFn() {
        age = 26;
        let name = 'suga';
        return height;
      }

      return innerFn;
    }
    
    const innerFn = outerFn();

위의 코드처럼 작성하면, innerFn에 outerFn함수의 리턴값, 즉 innerFn함수가 할당되기 때문에 innerFn변수를 사용하여 호출하면 전역scope에서 클로저함수의 호출이 가능하다.

javascript는 lexical scope를 채택하고 있으므로, 함수가 선언된 위치에 따라 유효범위가 달라지는 것이다.

shallow copy(얕은 복사)

const obj = {
	name : 'kim',
    age : 27,
    company : {
    	name : 'codestates',
        id : 00001,
        department : dev
    }
}

const copiedObj = Object.assign({}, obj);

assign메소드로 객체를 복사했을 경우, 객체는 참조형 데이터이기 때문에 주소값을 복사하고, 그렇기때문에 복사본을 수정했을 경우 원본도 수정이 될 것 같지만,

위의 경우 shallow copy가 된 상황이다.

shallow copy : 객체를 트리구조로 봤을 때, 최상위 노드만 주소값으로 복사

이 때, 최상위 구조란 참조형 데이터를 말한다.

즉, obj객체의 지역변수인 name과 age는 값을 복사한 것이므로, 서로 영향을 받지 않지만, 객체인 company의 경우에는 주소값이 복사되므로, 서로 영향을 받게 된다.

push, unshift의 리턴값

pop(), shift()의 리턴값은 제거된 원소의 값이라는 것을 알고 있다.
그렇다면, push(), unshift()의 경우 리턴값이 어떻게 될까?

arr = [1,2,3,4,5]

arr.push(9); // 6
arr.unshift(8); // 7 

위의 코드처럼 파라미터를 넣은 배열의 길이를 리턴해준다.

profile
프론트엔드 학습일지

0개의 댓글