12월 16일 복기

Ji Taek Lim·2020년 12월 17일
0

오늘은 함수의 scope에 대해서 배웠다.

자바스크립트가 위에서 아래로 내려가는 것으로

읽는 것으로 위에 전역변수를 선언해주고 그 위에 있는 것들은 읽지 못한다.

Hoisting이랑

함수의 두 가지 선언 declaration 과 expressions이 있는데

declaration을 위로 올려 버리는 것이다.

scope의 위치를 조절할 수 있다.

클로저 함수의 정의

mdn에 따르면 클로저의 정의는 다음과 같습니다. 반드시 기억하시기 바랍니다.
  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

  A closure is the combination of a function and the lexical environment within which that function was declared. This environment consists of any local variables that were in-scope at the time the closure was created.

  클로저는 함수와 함수가 선언된 어휘적 환경의 조합을 말한다.
  이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성된다.

여기서의 키워드는 "함수가 선언"된 "어휘적(lexical) 환경"입니다. 
특이하게도 자바스크립트는 함수가 호출되는 환경와 별개로, 기존에 선언되어 있던 환경 - 어휘적 환경 - 을 기준으로 변수를 조회하려고 합니다.
유어클레스 영상에서 언급되는 "외부함수의 변수에 접근할 수 있는 내부함수"를 클로져 함수로 부르는 이유도 그렇습니다.

클로저는 내부(inner) 함수가 외부(outer) 함수의 지역 변수에 접근할 수 있습니다.
이를 유념하시고 클로저의 유즈 케이스를 검색해 보시기 바랍니다. 아래 검색 키워드를 활용합니다.
  function factories
  namespacing private variables/functions
  
  
  
  
      /*
마지막 테스트 코드의 결과가 예상과는 달랐을 수도 있습니다.
'Object.assign'을 통한 복사는 reference variable은 주소만 복사하기 때문입니다. 
이와 관련하여 얕은 복사(shallow copy)와 깊은 복사(deep copy)에 대해서 학습하시기 바랍니다.
가이드가 될 만한 학습자료를 첨부합니다.
  https://scotch.io/bar-talk/copying-objects-in-javascript
  https://medium.com/watcha/깊은-복사와-얕은-복사에-대한-심도있는-이야기-2f7d797e008a
*/


function copy(mainObj) {
  let objCopy = {}; // objCopy will store a copy of the mainObj
  let key;

  for (key in mainObj) {
    objCopy[key] = mainObj[key]; // copies each property to the objCopy object
  }
  return objCopy;
}

const mainObj = {
  a: 2,
  b: 5,
  c: {
    x: 7,
    y: 4,
  },
}

console.log(copy(mainObj));

Rest Parameter
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/rest_parameters

arguments VS rest 파라미터

ES5에서도 가변 인자 함수의 경우 arguments 객체를 통해 인자값을 확인할 수 있었다.

1
2
3
4
var foo = function () {
console.log(arguments);
};
foo(1, 2); // { '0': 1, '1': 2 }

그렇다면 arguments와 rest파라미터의 차이점은 무엇일까?

답부터 말하면 arguments는 유사 배열 객체고 rest는 배열이다.

유사 배열 객체(array-like object)는 간단하게 순회가능한(iterable) 특징이 있고 length 값을 알 수 있는 특징이 있는 것이다. 즉, 배열처럼 사용할 수 있는 객체를 말한다.

무슨 말이냐면 arguments는 유사배열객체이기 때문에 Array 오브젝트의 메서드를 사용할 수 없다.

따라서 ES6에서는 arrow function에 arguments는 사용할 수 없을 뿐더러 Rest 파라미터를 사용하면 더 유연한 코드를 작성할 수 있는 것이기 때문에 Rest 파라미터 사용을 권장한다.

출처: https://jeong-pro.tistory.com/117 [기본기를 쌓는 정아마추어 코딩블로그]

/////

스프린트때 배운것.

name spacing

function factory (partially applied function)

restparameter 와 argument 차이

restparameter는 함수 인자로 받았을 때(인자가 몇개 들어올지 모를때 유용) 배열로 만들어주고

arguments는 함수가 생성될 때 자동으로 생기는건데 진짜 배열은 아니더라구요. 아까 배운것처럼 push 이런건 불가능하고, 그대신 for 문 같은건 쓸 수 있어요


let func = function(num1, num2) {
  console.log(arguments);
}

let func = function(num1, num2) {
  arguments[0] = 2;
  return num1 + num2
}

rest parameter은 array

argument 는 object


let func = function() {
console.log(`arguments(인자)의 길이는 ${arguments.length}입니다`)  
let sum = 0
  for (let el of arguments) {
    sum = sum + el
  }
return sum
}
func(3,2,3,2)

arguments(인자)의 길이는 4입니다
10

여기 보면 함수가 인자가 안들어갔는데.

자기가 argument 스스로 함수를 생성해낸것이다.

arguments 객체

하지만 배열은 아니다.

하지만 진짜 배열은 아니여서 Array.from이나 오늘 배운 Spread Syntax를 사용할 수 있습니다

let reaArray = […arguments]

console.log(Array.isArray(realArray))

true

---> 신기합니다...

(…args) 요것도 같은건데 이건 진짜 배열로 가져오고 그런 차이?가 있는 것 같아요

rest parameter 적용


function testFunc (...args) {
  console.log(args)
}
testFunc(42,2,3,11)

profile
임지택입니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN