들어가며
- 익명함수
- 익명함수의 화살표 표기법
- 즉시 실행 함수
- 변수의 scope 알아보기
안녕하세요!
트윅스스터디 그 두 번째 과제에서는 함수 더 알기 에서는 JavaScript
의 다양한 함수에 대해 알아보도록 하겠습니다.
(Anonymous function)
자바스크립트의 익명함수는 다음과 같은 형태를 가지고 있습니다.
function() {
console.log("javascript");
}
보면 함수의 이름이 없는 것을 확인할 수 있는데요,
익명함수는 재사용하지 않는 한 번만 사용할 함수이므로 따로 함수의 이름을 갖지 않고 변수에 담겨 사용됩니다.
주의할 점은 함수의 이름 != 변수 라는 것입니다.
리터럴방식(literal)으로 변수에 담겨 사용하는 것일 뿐이죠.
예시를 한 번 볼까요?
// console.log(tweeks()); -- 오류 발생
var tweeks = function() {
return "트윅스스터디의 제 2막";
};
console.log(tweeks());
위와 같이 tweeks
변수에 함수를 넣어 사용하기 위한 준비를 합니다.
변수와 같이 사용이 되기 때문에 반드시 ;
를 붙여주어야 합니다.
또 여기서 주의할 점은 tweeks
라는 익명함수가 정의되기 전에 호출하게 된다면 에러가 발생하게 됩니다.
이는 변수를 초기화하지 않고 사용한 것과 비슷합니다.
호이스팅이 안된다고도 합니다.
이것이 일반함수와 익명함수의 차이점이라고 할 수 있죠.
화살표함수란 function이라는 키워드 없이 => 를 이용해 함수를 생성하는 방법입니다.
그래서 좀 더 간결한 코드를 작성할 수 있습니다.
또 화살표 함수는 블록 스코프(scope)로 취급됩니다.
scope
에 관해서는 뒤에서 더 자세히 다루겠습니다.
화살표함수의 형태는 다음과 같습니다.
var/let/const 함수명 = (매개변수) => {실행문};
var tweeks = () => "트윅스스터디의 제 2막";
위의 예시는 매개변수가 없으므로 ()
로 대신하고 실행문이 한 줄이기 때문에 {}
를 생략해주었습니다.
기본적으로 화살표함수는 익명함수로만 사용할 수 있기 때문에 함수를 호출하기 위해서는 표현식으로 써야 합니다.
// 표현식 이용
var tweeks() => {
return "트윅스스터디 제 2막";
};
화살표함수를 사용할 수 없는 경우는 다음과 같습니다.
prototype
에 메서드를 할당하는 경우(IIFE, Immediately Invoked Function Expression)
정의되자마자 즉시 실행되는 함수인 즉시 실행 함수는 다음과 같이 ()
로 함수를 감싸 실행하는 문법을 사용합니다.
(function() {
console.log("트윅스스터디 많관부!");
})();
위의 예시를 실행하게 된다면 선언과 동시에 트윅스스터디 많관부!
가 출력됨을 확인할 수 있습니다.
앞서 말했듯 익명함수는 따로 함수의 이름을 갖지 않고 변수에 담겨 사용되었습니다.
하지만 즉시실행함수에는 이름이 없죠.
즉시실행함수에 익명함수를 사용해야 할까? 라고 물으신다면 일단 사용은 가능하다.라고 말씀드릴 수 있겠습니다.
하지만 즉시실행함수는 선언과 동시에 호출되기 때문에 재사용이 불가능합니다.
따라서 이름을 지어주는 것이 의미가 없게 되는 것이죠.
선언과 동시에 호출되어 실행되기 때문에 한 번 사용할 변수가 있다면 즉시실행함수를 사용하는 것이 메모리 관리에 좋습니다.
즉시실행함수는 외부에서 접근할 수 없는 자체적인 스코프를 가지게 됩니다.
내부변수를 외부로부터 private
하게 보호할 수 있다는 장점이 있습니다.
즉시실행함수는 한 번의 실행 이후 없어지므로 단 한 번의 사용에 필요한 함수에 사용됩니다.
예시로는 변수 초기화가 있습니다.
let tweeks;
(function init(page) {
let currentPage = page;
if (age >= 20) {
tweeks = true;
} else {
tweeks = false;
}
})(2);
console.log(tweeks); // true
console.log(page); // Uncaught ReferenceError: currentAge is not defined
scope
알아보기(scope)
란?스코프는 간단히 말해 유효범위입니다.
JavaScript
를 포함한 모든 프로그래밍 언어의 기본적 개념으로 확실한 이해가 필요하죠.
예제를 먼저 볼까요?
var tweeks = 2;
function season() {
var tweeks = "트윅스";
console.log(tweeks);
}
season();
console.log(tweeks);
이름이 같은 변수 tweeks
가 중복 선언되었죠.
전역에서 변수 tweeks
를 출력할 때, 함수 season()
내부에서 tweeks
를 출력할 때 중복된 2개의 변수 중 어떤 변수가 출력이 되어야 할까요?
어떻게 자바스크립트는 변수를 식별할까요??
scope는 참조 대상 식별자를 찾아내기 위한 규칙입니다. 자바스크립트는 이 규칙대로 식별자를 찾습니다.
위의 예제에서 전역에 선언된 tweeks
변수는 어디에든 참조할 수 있지만,
함수 season()
내에서 선언된 tweeks
변수는 함수 season()
안에서만 참조할 수 있고 함수 외부에서는 참조가 불가능합니다.
이러한 규칙을 스코프라고 부릅니다.
자바스크립트에서 스코프를 구분한다면 2가지로 구분할 수 있습니다.
전역 스코프 (Global scope) | 지역 스코프(Local scope or Function-level scope |
---|---|
코드 어디에서든지 참조 가능 | 함수 코드 블록이 만든 스코프로 함수 자신과 하위 함수에서만 참조할 수 있다. |
쉽게 비유하자면 전역 변수
와 지역 변수
의 개념입니다.
변수는 선언 위치에 따라 스코프를 달리 가집니다.
자바스크립트의 스코프는 타 언어와는 다른 특징을 갖고 있습니다.
대부분의 언어는 블록 레벨 스코프 (block-level scope)를 따릅니다.
블록레벨스코프란 코드 블록 내에서만 접근이 가능해지는 스코프를 의미합니다.
if (true) {
int x = 10;
println(x);
}
println(x);
위의 예시는 java
언어로 쓰여진 코드로 블록 레벨 스코프를 따릅니다.
if문 안에서 선언된 x
변수는 블록 레벨 스코프를 따르므로 if문 밖의 println
출력에 응하지 않겠죠?
하지만 자바스크립트는 함수 레벨 스코프 (function-level scope)를 따릅니다.
함수 레벨 스코프란 함수 코드 블록 내에서 선언된 변수는 함수 코드 블록 내에서만 유효하고 함수 외부에서는 유효하지 않는, 즉 참조할 수 없습니다.
단, let 키워드를 사용하면 블록 레벨 스코프를 사용할 수 있습니다.
var x = 0;
{
var x = 1;
console.log(x); // 1
}
console.log(x); // 1
let y = 1;
{
let y = 0;
console.log(y); // 0
}
console.log(y); // 1
위의 예제에서 var
로 선언한 변수 x
는 함수 레벨 스코프를 따르지만,
let
으로 선언한 변수 y
는 블록 레벨 스코프를 따르는 것을 알 수 있죠.
(Global scope)
와 지역 스코프 (Local scope)
전역 스코프는 전역에 변수를 선언했을 때 가질 수 있습니다.
지역 스코프는 함수 코드 블록이 만든 스코프로 함수 자신과 하위 함수에서만 참조할 수 있습니다.
자바스크립트는 c
처럼 기본적인 main()
함수가 없기 때문에 전역 스코프를 갖는 전역 변수를 남발하기가 굉장히 쉽기 때문에 주의해야 합니다.
var tweeks = 2;
function fun() {
var season = 0;
console.log(tweeks);
console.log(season);
}
fun();
console.log(tweeks);
console.log(season); // Uncaught ReferenceError: local is not defined
변수 tweeks
는 전역에 선언하였기 때문에 전역 스코프를 가지게 되어 어디서든 참조할 수 있습니다.
하지만 변수 season
은 함수 내에 있는 지역 변수이므로 지역 스코프를 가지게 되어 참조하지 못해 console.log(season);
에서 오류가 나게 됩니다.
이번 게시물에서는 자바스크립트의 좀 더 다양한 함수에 대해 알아보았습니다.
언뜻 익숙한 함수와,
익숙하지만 새로운 개념이었던 스코프,
생소했던 익명함수와 화살표표기법.
이제 자바스크립트의 함수에 대해 조금이나마 알게 된 느낌이라 굉장히 뿌듯하군요.
그럼 다음 게시물에서는 자바스크립트의 이벤트와 이벤트 리스너에 대해서 공부해보겠습니다.