
함수 내의 구문들은 페이지가 로드될 때마다 실행되지 않기 때문에 작업을
완료하는 데 필요한 단계들을 함수로 보관해 둘 수 있다.
보관한 함수를 실행하려면 함수를 호출(call)해야한다.
경우에 따라서 추가 정보를 매개변수 형태로 함수에 전달한다.
함수를 작성할 때 함수의 실행 결과를 다시 전달받아야 하는 경우도 있다.
이런 함수의 응답을 '리턴 값(return value)이라 한다.
// 함수선언
(함수키워드) (함수이름)
function sayHello(){
document.wrtie('안녕하세요');
}
함수 이름은 camel case, snake case로 사용하고,
기능에 해당하는 이름으로 이해하기 쉽게 지어야햔다.
// 함수호출
(함수이름)
sayHello();
<body id="theBody">
<button onclick="changColor();>배경색 바꾸기</button>
<script>
const color = ["#5F2D9A", "#FEDB13", "#F67272", "#0D9C71"];
let i = 0;
function changeColor() {
i++;
if(i >= color.length) {
i = 0;
}
const bodyTag = document.getElementById("theBody");
bodyTag.style.backgroundColor = color[i];
</script>

간혹 함수는 자신의 작업을 수행하기 위해 추가적인 정보가 필요할 수도 있다.
이런 경우에는 함수를 선언할 때 '매개변수(parameter)'를 전달하면 된다.
function getArea(width, height){
return width * height;
└────────┘
// 매개변수는 함수 내에서 변수처럼 사용된다.
}
값을 인수로 전달하기
getArea(3,5);
- 매개변수를 가진 함수를 호출할 때는 함수 이름의 다음의 괄호 안에 값을 명시하면 된다.
이 값을 인수(arguments)라고하며, 이를 통해 값이나 변수를 전달할 수 있다.
<script>
function calculateArea(width, height){
const area = width * height;
return area;
}
const elOne = calculateArea(3, 5);
const elTwo = calculateArea(8, 5);
console.log(elOne);
console.log(elTwo);
</script>
// 자바스크립트 해석기는 return 키워드를 만나면 함수의 실행을 중단한다.
그런 후 함수를 호출한 코드로 되돌아간다.
만일 return 키워드 이후에 다른 구문이 함수 내에 존재한다면 그 코드들은 실행되지 않는다.

- 먼저, getSize()라는 이름의 새로운 함수를 정의한다. 계산된 면적은 area라는 변수에 저장된다.
- 부피는 volume 이라는 변수에 계산하여 저장한다. 그리고 두 변수의 값을 size라는 배열에 저장한다.
- 이후 size() 함수를 호출한 코드가 계산된 값을 사용할 수 있도록 이 배열을 리턴한다.
- areaOne변수는 3*2의 연산결과인 사각형의 면적을 저장하게 된다. 이 값은 sizes의 첫 번째 배열의 값이다.
- volumeOne 변수는 323의 연산 결과인 사각형의 부피를 저장하게 된다. 이 값은 sizes의 두 번째 배열의 값이다.
<script>
function getSize(width, height, depth){
const area = width * height;
const volume = width * height * depth;
const sizes = [area, volume];
return sizes;
}
const areaOne = getSize(3, 2, 3)[0];
const volumeOne = getSize(3, 2, 3)[1];
console.log(areaOne);
console.log(volumeOne);
</script>

<script>
const num1 = Number(prompt("첫 번째 수는?",""));
const num2 = Number(prompt("두 번째 수는?",""));
const addNumber = function(a, b){
const sum = a + b;
return document.write("두 수를 더한 값은 " + sum + "입니다.");
}
addNumber(num1, num2);
</script>

const area = (function() {
const width = 3;
const height = 2;
return width * height;
} () );
└─ 함수가 즉시 호출되어야 한다는 사실을 알려준다.

//전역변수 : 자바스크립트 어디에서든 사용할 수 있는 변수
//지역변수 : 함수 스코프내에서만 사용할 수 있는 변수
let a 'global'; ─┐ a의 유효범위
function myFnc(){│
let b = 'local'; ─┐ b의 유효범위
console.log(a); //global
return b; ─┘
}
myFnc();
console.log(b); //ReferenceError ─┘
<script>
let scope = "Global";
function show(){
let scope = "Local";
return scope;
}
console.log(show());
console.log(scope);
</script>

함수와 객체 내부에서 주로 사용된다.
함수가 선언된 위치에 따라 this 키워드의 의미가 달라진다.
이 키워드를 하나의 객체를 참조하며,
주로 특정 시점에 함수를 실행하고 있는 객체를 가리킨다.
스크립트의(다른 객체나 함수 내부가 아닌) 최상위 수준에 함수를 선언하면, 이 함수는 전역범위(global scope) 혹은 전역 컨텍스트(global context)에 포함된다.
이 컨텍스트에 속한 기본 객체는 window 객체이므로 전역 컨텍스트 내에 선언된 함수 내에서 this 키워드를 사용하면 이 키워드는 window 객체를 가리키게 된다.
아래 코드에 있는 this는 window 객체의 속성을 리턴하기 위한 목적으로 사용되었다.
<script>
'use stric';
const x = this;
console.log(x);
</script>

<script>
function windowSize(){
const width = this.innerWidth;
const height = this.innerHeight;
return [width,height];
}
console.log(windowSize());
</script>

<script>
"use strict";
let num = 0;
function addNum(){
this.num = 100; //ERROR! Cannot set property 'num' of undefined
num++;
}
console.log(addNum());
</script>

<script>
const person = {
firstName : "Jin-won",
lastName : "Shen",
fullName : function(){
return this.firstName + " " + this.lastName;
},
};
console.log(person.fullName());
</script>

<script>
funtion person(){
this.name = name;
}
const kim = new Person("kim");
const lee = new Person("lee");
console.log(kim.name);
console.log(lee.name);
</script>
