익명함수
로만 사용할 수 있기 때문에함수표현식
을 사용.함수표현식
let func = function(arg1, arg2, ...argN) {
return expression;
};
↓
화살표 함수
let func = (arg1, arg2, ...argN) => expression
//인자 arg1..argN를 받는 함수 func.
함수 func는 화살표(=>) 우측의 표현식(expression)을 평가하고,
평가 결과를 반환
=>
왼쪽에 있는 인수를 이용해 =>
오른쪽에 있는 표현식을 평가하는 함수예시
let sum = function(a, b) {
return a + b;
↓
let sum = (a, b) => a + b;
let double = n => n * 2;
let sayHi = () => alert("안녕하세요!");
let sum = (a, b) => { // 중괄호는 본문 여러 줄로 구성되어 있음을 알려줌
let result = a + b;
return result; // 중괄호 사용 시, return 지시자로 결괏값을 반환
};
전역변수를 사용해야 하는 분명한 경우가 아닐 경우,
지역변수를 쓰는 것이 바람직하다
(함수 안에서 변수를 선언할 때, let을 써주라는 얘기)
유효범위(Scope)
: 변수의 수명
지역변수(Local Variable)
: 함수의 중괄호{ } 안 쪽에서만 접근할 수 있는 변수
전역변수(Global Variable)
: 자바스크립트 전체에서 접근할 수 있는 변수. 어떤 함수에 속해있지 않으면 전역변수
let vscope1 = 'global';
function fscope(){
let vscope2 = 'local';
console.log(vscope);
}
console.log(vscope1) // "global"
console.log(vscope2) // "error"
"ReferenceError: vscope2 is not defined
예제 1️⃣
let vscope = 'global';
function fscope(){
let vscope = 'local'; // 🔴
}
fscope();
console.log(vscope); 🔵
// "global"
여기서 vscope를 찍어보면 'global'이 나옴
∵ let 키워드를 쓰게 되면 vscope을 함수 안에서 새로 선언하는 것이고 결국 이것은 지역변수가 된다. 그래서 🔵이거는 함수 밖에서 호출한 것이기 때문에 지역변수가 아닌 전역변수 값인 'global'이 나오게 된 것
예제 2️⃣
위에서 🔴 줄의 let을 없애고 다시 실행하면
let vscope = 'global'; 🟢
function fscope(){
vscope = 'local'; // 🔴
}
fscope();
console.log(vscope); 🔵
// "local"
결과 값으로 'local'이 나옴
∵ let을 빼고 vscope을 쓰면 이거는 변수를 새로 선언한 것이 아니라 같은 이름을 가진 기존의 전역변수를 재할당한 것
또한 그 순서도 중요한데, 🔵 여기서 찍힌 vscope은 일단 🟢 이 전역변수의 'global'을 호출하는 것인데 여기 'global'이 fscope()함수 안의 변수 재할당에 의해서 'local'로 바뀌게 된 것!
예제 3️⃣
마지막으로 이렇게 변경되면
let vscope = 'global'; 🟢
function fscope(){
let vscope = 'local'; // 🔴
vscope = 'local' 🟡
}
fscope();
console.log(vscope); 🔵
// "global"
🔴 여길 보면 let을 썼다는 말은 이미 지역변수가 선언이 되었다는 것
🟡 여기의 vscope은 함수 안에 있으니까 우선적으로 지역변수가 있는지 체크하고 지역변수가 있으니까 지역변수를 재할당
자바스크립트는 함수의 중괄호 { } 안에서 선언된 변수만이 지역변수가 되는 것이고 함수를 제외한 나머지(for문, if문 등)에서의 중괄호 { } 안에서 선언된 변수는 전역변수임
자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다.
(호출된 시점에서의 유효범위가 아니라는 말)
정적 유효범위(static scoping)
or 렉시컬(lexical scoping)
이라고 부름
let i = 5;
function a(){
let i = 10;
b();
}
function b(){
console.log(i);
}
a()
// 5
동적 유효범위
가 될 것정적 유효범위
자바스크립트에서는 함수도 객체(=값)
이다.
1) 그래서 변수에 담을 수 있음
2) 객체 안에도 담을 수 있음 => 객체 안에 있는 함수는 메소드라고 부름
3) 다른 함수의 인자로도 담을 수 있음
예시
function cal(func, num){
return func(num)
}
function increase(num){
return num+1
}
function decrease(num){
return num-1
}
alert(cal(increase, 1)); // 2
alert(cal(decrease, 1)); // 0
4) 함수의 리턴값으로도 사용 가능
function cal(mode){
var funcs = {
'plus' : function(left, right){return left + right},
'minus' : function(left, right){return left - right}
}
return funcs[mode];
}
alert(cal('plus')(2,1));
alert(cal('minus')(2,1));
5) 배열값으로도 사용 가능
var process = [
function(input){ return input + 10;},
function(input){ return input * input;},
function(input){ return input / 2;}
];
var input = 1;
for(var i = 0; i < process.length; i++){
input = process[i](input);
}
alert(input);
// 11
// 121
// 60.5
1급 객체(First-calss Object)
: 다양한 용도로 사용될 수 있는 데이터. 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체콜백(Callback)
: 어떤 함수가 수신하는 인자가 함수인 경우
콜백함수(callback function)
: 매개변수로 전달하는 함수동기적 처리(Synchronous)
: 코드가 위에서 부터 아래로 내려오면서 하나가 응답을 받아야 다음 코드가 실행되는 방식비동기적 처리(Asynchronous)
: 요청을 보낸 후 응답에 상관없이 다음 동작을 실행하는 방식. 비동기적 API를 제외한 모든 코드를 실행한 이후에 비동기적 API가 실행됨① name-value 쌍 : { key : value }
{
"firstName" : "Minho",
"lastName" : "Kim",
"hobby" : "sleeping"
}
② list 형식 : [ value1, value2, ... ]
{
"firstName" : "Minho",
"lastName" : "Kim",
"hobby" : ["sleeping", "playingsoccer"]
}
function outter(){
var title = 'coding everybody';
function inner(){
alert(title);
}
inner();
}
outter();
// 'coding everybody'
함수 안에서 함수의 인자와 여러가지 정보들을 담고 있는 객체. 사용방법이 배열과 유사
여기 arguments는 함수 호출시에 사용자가 전달한 인수 값이 arguments에 들어가 있는 것. 몇개의 인수가 들어올 지 모를 때 유용.
arguments.length
: 인수의 개수를 알 수 있음arguments[i]
: 그 각각의 인수에 접근할 수 있음함수이름.length
: 그 함수가 매개변수로 정의한 개수를 알 수 있음함수의 호출 ✍🏼