function outer() {
var a = 1;
console.log(a);
}
outer();
a를 콘솔에 찍어보려고 할 때 a를 먼저 찾아야하는데 이때 scope를 사용하게 됩니다
scope는 table 형식으로 변수를 저장하고 있다고 이해하면 쉬운데 결국 scope는 변수의 값을 찾아올 때 들여다 보는 곳입니다
예를들면..
var A | 1 |
이때 이 scope는 outer라는 이름으로 정의되어있어 변수 A를 찾아올 때 우선 outer에 scope를 확인하게 됩니다.
function outer() {
var a = 1;
function inner() {
var a = 2;
console.log(a);
}
inner();
}
outer();
이렇게 작성하면 어떻게 나올까?
콘솔에 2가 나온다. 즉 여기서 javascript는 함수단위로 scope를 만든다고 이해할 수 있다. → es6에서는 조금 다르니 참고
이렇게 scope가 각각 만들어짐
outer용
var A | 1 |
inner용
var A | 1 |
function outer() {
var a = 1;
var b = "B";
function inner() {
var a = 2;
console.log(a);
console.log(b);
}
inner();
}
outer();
이렇게 된다면 어떻게 될까?
우선 inner에서 변수 b를 찾아본 후 없다면 outer를 찾아본다
javascript 자체에서 outer안에 inner를 정의해놓았기 때문에 inner가 없다면 outer를 찾아가게 된다. 이렇게 다른 함수를 찾아갈 수 있도록 js에서는 위 스코프 표에 다음 찾아볼 함수를 표시해놓는다. 이렇게 연결되는 것을 스코프 체인이라고 한다
var c = "X"
function outer() {
var a = 1;
var b = "B";
function inner() {
var a = 2;
console.log(a);
console.log(b);
console.log(c);
}
inner();
}
outer();
이렇게되어있다면 inner → outer → global 순으로 갈 것이다.
이게 스코프체인이라고 이해하면 된다
마지막으로 클로저입니다
var c = "X"
function outer() {
var a = 1;
var b = "B";
function inner() {
console.log(b);
}
return inner;
}
var someFunction = outer();
someFunction();
이렇게 실행했을 때 someFunction에서는 outer에서 return 값인 inner 함수를 받게 되는데 이때 someFunction을 실행시켰을 때 다른 언어들을 생각해보면 에러가 뜰 것이라고 예측할 수 있다.
왜냐하면 outer()를 실행시키고 scope는 소멸되어 b라는 변수가 없어졌을 것이라고 생각하게 되는데 javascript에서는 만들어진 scope를 없애지 않는다. 이렇게 스코프를 없애지않고 유지시켜 주는 것을 클로저라고 한다
'TIL > 개념정리' 카테고리의 다른 글
Call stack (호출 스택) (0) | 2022.10.24 |
---|---|
함수와 함수호출, 고차함수에서의 호출 (0) | 2022.10.23 |
Python - Selenium으로 매크로 만들기 (0) | 2022.09.08 |
Docker에 대해서 (0) | 2022.09.07 |
NextJS 간단 정리 (2) | 2022.09.06 |