[learning javascript] chapter 6. 함수

함수

function sayHello() {
    // 함수 바디는 여는 중괄호로 시작
    
    console.log("Hello world!");

    // 닫는 중괄호로 끝
}

반환 값

호출과 참조

함수와 매개변수

매개변수가 함수를 결정하는가?

매개변수 해체

const o = { subject: “I”, verb: “love”, object: “JavaScript”, };

getSentence(o); // “I love JavaScript”

- 프로퍼티 이름은 반드시 유효한 식별자여야 하고, 들어오는 객체에 해당 프로퍼티가 없는 변수는 `undefined`할당
- 배열 역시 해체 가능
```javascript
function getSentence([subject, verb, object]) {
    return `${subject} ${verb} ${object}`;
}

const arr = [ "I", "love", "JavaScript" ];
getSentence(o);     // "I love JavaScript"

매개변수 기본값

객체의 프로퍼티인 함수

this 키워드

함수 표현식과 익명 함수

화살표 표기법

const f2 = function(name) { return Hello, ${name}!;} // 또는 const f2 = name => Hello, ${name}!

const f3 = function(a,b) { return a+b ;} // 또는 const f3 = (a,b) => a + b;

- this가 다른 변수와 마찬가지로 정적으로 묶임
```javascript
const o = {
    name: 'Julie',
    greetBackwards: function() {
        const getReverseName = () => {
            let nameBackwards = '';
            for(let i=this.name.length-1; i>=0; i--) {
                nameBackwards += this.name[i]
            }
            return `${getReverseName()} si eman ym ,olleH`;
        };
        return `${getReverseName()} si eman ym ,olleH`;
    },
};
o.greetBackwards();

call과 apply,bind

// 이 함수는 어떤 객체에도 연결되지 않았지만 this를 사용 function greet() { return Hello, I'm ${this.name}!; }

greet(); // “Hello, I’m undefined!” - this는 어디에도 묶이지 않았음 greet.call(bruce); // “Hello, I’m Bruce!” - this는 bruce greet.call(madeline); // “Heelo, I’m Madeline!” - this는 madeline

- call을 사용하고 this로 객체를 넘기면 해당 함수가 주어진 객체의 메서드인 것처럼 사용할 수 있음
- call의 첫번째 매개변수는 this로 사용할 값이고, 매개변수가 더 있으면 호출하는 함수의 매개변수로 전달
```javascript
function update(birthYear, occupation) {
    this.birthYear = birthYear;
    this.occupation = occupation;
}

update.call(bruce, 1949, 'singer');     
// bruce는 {name: "bruce", birthYear: 1949, occupation: "singer"}로 변경

update.call(madeline, 1942, 'actress'); 
// Madeline은 {name: "Madeline", birthYear: 1942, occupation: "actress"}로 변경

update.call(madeline, [1918, “writer”]); // Madeline은 {name: “Madeline”, birthYear: 1942, occupation: “actress”}로 변경

- apply는 배열 요소를 함수 매개변수로 사용해야 할 때 유용
- 배열의 최대값, 최소값 구하는 것처럼 여러 데이터를 한꺼번에 넘겨 무언가를 처리할 때 좋음
```javascript
const arr = [2, 3, -5, 15, 7];
Math.min.apply(null, arr);  // -5
Math.max.apply(null, arr);  // 15

updateBruce(1904, “actor”); // bruce는 저 값으로 변경 updateBruce.call(madeline, 1274, “king”); // madeline은 변하지 않음

- bind는 함수의 동작을 영구적으로 바꾸므로 찾기 어려운 버그의 원인이 될 수 있음
- bind에 매개변수를 넘기면 항상 그 매개변수를 받으면서 호출되는 새 함수를 만드는 효과가 있음
```javascript
const updateBruce1949 = update.bind(bruce, 1949);
updateBruce1949("singer, songwriter");
// bruce는 {name: "bruce", birthYear: 1949, occupation: "singer, songwriter"} 임