유효범위(Scope)는 변수의 수명을 의미한다.
var vscope = `global`;
function fscope(){
alert(vscope);
}
fscope();
vscope변수에 global이라는 값을 할당.
fscope()이라는 함수는 그 함수 안에 선언되어있지않은 함수밖에 선언되어있는 vscope라는 변수에 접근할수있다.
var vscope = `global`; //전역변수
function fscope(){
var vscope = 'local'; //지역변수
alert(vscope);
}
fscope();
local이 출력된다.
why? 함수내부에서 가까이 있는 지역변수가 있기때문에 먼저 지역변수에 값을 출력한다.
var vscope = `global`;
function fscope(){
alert(vscope);
}
function fscope2(){
alert(vscope);
}
fscope();
fscope2();
global이 두번 출력된다.
why? 전역변수는 모든 함수에서 접근이 가능하기 때문이다.
var vscope = `global`; //전역변수
function fscope(){
var vscope = 'local'; //지역변수
var lv = 'local variables'; //지역변수
alert(lv);
}
fscope();
alert(lv);
alert에서 lv는 undefined 취급을 받는다.
why? fscope함수 내부에 lv변수는 지역변수 이기때문에 외부에서 호출이 불가능하다.
var vscope = `global`; //전역변수
function fscope(){
vscope = 'local'; //전역변수
}
fscope();
local이 출력된다.
why? var을 사용하지 않았기 때문에 전역변수의 vscope의 값을 local로 변경했기 때문이다.
var vscope = `global`; //전역변수
function fscope(){
var vscope = 'local'; //지역변수
vscope = 'local'; //지역변수
}
fscope();
local이 출력된다.
why? 이미 var로 지역변수를 선언했기 때문에 vscope = 'local은 지역변수 vscope의 값을 변경했기 때문이다.
전역변수 사용을 지양해야한다.
프로그래밍은 작은것에서 큰것에서 발전되기 때문에 그 과정에서 협업 중 똑같은 이름의 변수를 다르게 사용할 수 있기 때문에 의도하지 않는 코드가 이루어질 수 있다.
지역변수를 사용하는것이 이러한 문제를 회피할수있다.
function a (){
var i = 0; //지역변수
}
for(var i = 0; i < 5; i++){
a();
documen.write(i);
01234출력
function a (){
i = 0; //전역변수
}
for(var i = 0; i < 5; i++){ //전역변수
a();
documen.write(i);
오류
why? a함수에서 i의 값을 0으로 하기 때문에 무한루프가 발생
자바스크립트는 함수에 대한 유효범위만을 제공한다. 많은 언어들이 블록(대체로{})에 대한 유효범위를 제공하는 것과 다른 점이다.
자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다. 이러한 유효범위의 방식을 정적 유효범위 혹은 렉시컬 이라고 한다.
var i = 5; //전역변수
function a(){
var i = 10; //지역변수
b();
}
function b(){
document.write(i);
}
a();
5출력
why? 사용될 때가 아니라 정의될 때의 전역변수가 사용되게한다