JavaScript
JS | 클로저
개발 공부
2022. 12. 28. 17:40
Lexical scoping (렉시칼 스코프) :
함수가 선언된 위치에 따라서 사용할 수 있는 값(참조될 수 있는 값)이 달라진다.
함수의 선언 위치에 따라서 상위 스코프를 결정하게 된다.
나랑 가까운 b전역변수를 참조하게 된다.
//렉시칼 스코프 - 함수의 선언 위치에 따라서 상위 스코프를 결정하게 된다.
var a = 1;
function x(){
a = 10;
console.log(a); //10
}
x();
var b = 1;
function y(){
var b = 10;
z();
}
function z(){
console.log(b);
}
y(); //1
클로저
내부함수를 이용해서 외부함수(a)의 변수의 접근할 수 있는 환경을 만들어준다.
function func1(){
var a = 1;
//클로저를 사용하면 a를 밖에서 사용할 수 ㅇㅇ
//1st
// var b = function(){
// return a;
// }
// return b;
//2nd
return function() {
return a;
}
} //a의 범위는 여기까지
//console.log(a); //err
var result = func1(); //result는 내부함수
var x = result();
console.log(x); //x는 a값
클로저 은닉
function obj(){
var name = "홍길동";
return function(){
return name;
}
}
var getObj = obj();
console.log(obj());
console.log(getObj());
function obj(){
var name = "홍길동";
//get
// return function(){
// return name;
// }
//set
// return function(aaa) {
// name = aaa;
// console.log(name);
// }
return { //중괄호는 객체
getName : function(){
return name;
},
setName : function(aaa){
name = aaa;
}
}
}
// var getObj = obj();
// console.log(obj());
// console.log(getObj());
// var setObj = obj();
// setObj('이순신');
//
var result = obj(); //obj 반환
result.setName("이순신"); //setter
console.log(result.getName()); //getter