민규의 개발블로그
자바스크립트 함수스코프, 블록 스코프 본문

함수 기반 스코프
함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉, 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선언한 변수는 모두 전역 변수이다.
- 스코프 전체에서 변수가 살아있음(전역 변수 남발)
- var 키워드 생략 허용
- 변수 중복 선언 허용
함수 선언문과 함수 표현식의 차이
함수 이름이 어디의 확인자로 묶이느냐와 관련
function이라는 단어가 구문 시작 위치에 있다면 함수 선언문이고, 다른 경우는 함수 표현식
함수 표현식 즉시 호출하는법
( )로 함수를 감싸면 함수를 표현식으로 바뀨눈대, (function foo( ) { } ) ( ) 처럼 마지막에 또 다른 ( )를 붙이면 함수를 실행할 수 있다. 함수를 둘러싼 첫 번째 ( )는 함수를 표현식으로 바꾸고, 두 번째( )는 함수를 실행시킨다.
이를 약어로 IIFE라 한다. (즉시, 호출, 함수, 표현식)
(funtion foo(){ | |
var a =3; | |
console.log(a); // 3 | |
})(); |
블록 스코프
대부분의 프로그래밍 언어는 블록 레벨 스코프(Block-level scope)를 따르지만 자바스크립트는 함수 기반 스코프(Function-level scope)를 따른다.
모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다. 즉, 코드 블록 내부에서 선언한 변수는 지역 변수이다.
let
ES6는 블록 레벨 스코프를 따르는 변수를 선언하기 위해 let 키워드를 제공한다.
var과의 차이점
- 블록 스코프 기능
- 변수 중복 선언 불가
- 호이스팅 불가
var foo = 123; // 전역 변수 | |
let voo = 321; // 전역변수 | |
console.log(foo); // 123 | |
console.log(voo); // 321 | |
{ | |
var foo = 456; // 전역 변수 | |
let zoo = 678; // 지역 변수 | |
} | |
console.log(foo); // 456 | |
console.log(zoo); Reference error |
const
ES6에서는 키워드 let과 함께 const도 추가됐다. const 역시 블록 스코프를 생성하지만, 선언된 값은 고정된다(상수).
{ | |
const a =3; | |
const a =4'; | |
} | |
console.log(a); // SyntaxError |