모듈이란? 여러 기능들에 관한 코드가 모여있는 하나의 파일
예제 1.
var vscope = 'global';
function fscope(){
alert(vscope);
}
fscope();
//결과값 : 'global'
fscope의 값은 global을 호출한다. --> 함수 바깥에 있는 변수에 접근할 수 있다.
예제 2.
var vscope = 'global'; //전역변수 (global variable)
function fscope(){
var scope = 'local'; //지역변수 (local variable)
alert(vscope);
}
fscope();
//결과값 : 'local'
function 바깥에 있는 변수를 전역변수(global variable)
function 안에 있는 변수를 전역변수(local variable)라고 한다.
예제 3.
var vscope = 'global';
function fscope(){
var scope = 'local';
var lv = 'local variables'
alert(vscope);
}
fscope(); //결과값 : 'global'
alert(lv); //결과값 : undefined
함수 내에서 만들어진 lv는 지역변수이고 지역변수는 그 지역에서만 접근할 수 있다.
예제 4.
var vscope = 'global';
function fscope(){
vscope = 'local';
alert(vscope);
}
fscope(); //결과값 : 'local'
alert(vscope); //결과값 : 'local'
function fscope()안의 vscope는 전역변수인 vscope인 global을 재 할당한것이다.
따라서 지역변수가 아니다.
예제 5.
var vscope = 'global';
function fscope(){
var vscope = 'local'; //지역변수 생성
vscope = 'local'; //지역변수의 값을 재할당함
alert(vscope);
}
fscope(); //'local'
alert(vscope); //'global'
function a (){
var i = 0;
}
for(var i = 0; i < 5; i++){
a();
document.write(i);
}//01234
function a (){
i = 0;
}
for(var i = 0 ; i < 5; i++){ //for문에서의 i는 전역변수이다.
a();
document.write(i);
}
상단의 function은 무리없이 결과값이 나오지만
하단의 function은 무한루프가 반복된다.
같은이름의 변수를 중복해서 사용했지만 각각의 취지가 다를때 문제가 발생한다.
var MYAPP = {}
MYAPP.calculator = {
'left' : null,
'right' : null
}
MYAPP.coordinate = {
'left' : null,
'right' : null
}
MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;
function sum(){
return MYAPP.calculator.left + MYAPP.calculator.right;
}
document.write(sum());
(function(){
var MYAPP = {}
MYAPP.calculator = {
'left' : null,
'right' : null
}
MYAPP.coordinate = {
'left' : null,
'right' : null
}
MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;
function sum(){
return MYAPP.calculator.left + MYAPP.calculator.right;
}
document.write(sum());
}())
MYAPP은 함수안에서 호출되기때문에 더이상 전역변수가 아니라 지역변수가 된다.
단 하나의 전역변수도 허용하고 싶지 않다면 이렇게 익명함수를 사용한다.
자바스크립트에서 지역변수를 허용하는것은 함수에 한해서이다.
많은 언어들이 블록단위의 유효범위를 지정하는것과는 조금 다르다.
for(var i = 0; i < 1; i++){
var name = 'coding everybody';
}
alert(name);
해당 name변수는 for문 안의 중괄호 안에서만 유효한 변수가 아니고 for문 바깥에서도 유효한 변수이다.
자바스크립트에서는 함수 외 for문이나 if문 같은 곳에서는 중괄호 안에 쓰여진 변수는 지역변수로서의 의미를 갖지 않는다.
var i = 5;//전역변수
function a(){
var i = 10;//지역변수
b();
}
function b(){
document.write(i);
}
a();
사용될때 가 아니고 정의될때 당시의 변수가 사용된다. --> 정적 유효범위 or lexicl scoping
자바스크립트에서 함수는 값이다.
//예제 1.
var a = "value";
//변수 a에 "value"를 담을 수 있는 이유 : "value"가 값이라서
//예제 2.
function a(){}
var a = function(){}
//예제 3.
a = {
b:function(){
}
//b:key--> key가 어떠한 값을 저장하고있는 변수와 같은 역할을 한다.
//프로퍼티안의 값이 함수이면 "메소드" 라고 한다
};
함수의 인자로 함수가 들어가는 경우 콜백이라고 한다.
let number = [1, 2, 3, 4, 5];
number.forEach(function(x) {
console.log(x * 2);
});
function whatYourName(name, callback) {
console.log('name: ', name);
callback();
}
function finishFunc() {
console.log('finish function');
}
whatYourName('younu', finishFunc);
클로저란? 외부함수(포함하고 있는)의 변수에 접근할 수 있는 내부 함수
개발자도구에 의해 변경되어서는 안되는 중요한 정보를 전역변수로 만들지 않고 지역변수로 만들어서 변수를 보호하는 기법.
function outter(){//외부함수
var title = 'coding everybody'; //외부함수에서 선언된 지역변수
function inner(){//내부함수
alert(title);
}
inner();
}
outter();
내부함수는 외부함수의 지역변수에 접근할 수 있다.
function outter(){
var title = 'coding everybody';
return function(){
alert(title);
}//내부함수를 리턴 (outer함수는 더이상 사용하지않는 함수이다.)
}
var inner = outter();
inner();//결과값 : 'coding everybody'
내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다.
데이터를 보존할 수 있다.
클로저 함수는 외부 함수의 실행이 끝나더라도 외부 함수 내 변수를 사용할 수 있다.
클로저는 이처럼 특정 데이터를 스코프 안에 가두어 둔 채로 계속 사용할 수 있게하는 폐쇄성을 갖는다.
정보의 접근 제한 (캡슐화)
‘클로저 모듈 패턴’을 사용해 객체에 담아 여러 개의 함수를 리턴하도록 만든다.
이러한 정보의 접근을 제한하는 것을 캡슐화라고 한다.
모듈화에 유리하다.
클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있다.
클로저를 통해 데이터와 메소드를 묶어다닐 수 있기에 클로저는 모듈화에 유리하다.