2019년 5월 16일 목요일

#3 JavaScript Scope(유효범위)


JS 유효범위(Scope)


지역변수 :  함수내부에서 만들어진 변수, 함수 밖에서 사용할 수 없다

전역변수 :  JS 전체에서 사용가능


일반적으로 JS에서 var라는 것은 local variable을 나타내는데


예를 들어서 본다면

var myvar1 = 'global'

function myfunc(){
var myvar1 = 'local';
myvar1 = 'local';
}
myfunc()
alert(myvar1)


global을 할당해준 부분은 함수 밖에서 전역 변수로 선언을 해주었고

함수안에서도 var myvar1을 이용해서 local을 할당해주었는데
함수안에서 선언되었으므로 local variable이 된다

그리고 밑에 따라온 myvar1 또안 var를 붙이지 않았지만
이 경우 같은 함수내에 local variable이 있으므로 해당 variable을 찾아가서 변경시켜준다
그래서 alert(myvar1)의 값은 그대로 global이다

만약 같은 함수내에 var myvar1이 없었으면
myvar1 = 'local' 이 global variable에 영향을 미쳐 alert(myvar1)의 값은 local이 될것이다.


따라서 우리는 특별한 이유가 아니라면 함수밖에서 전역변수를 사용하는것을 자제해주는게 좋다

==> 왜냐면 단순히 변수를 전역변수로 사용해주게 되면 나중에 코드가 꼬일 수도 있고 에러를 발생시킬수 있다.



var를 이용해서 함수내에서 정의 해주자


그래서 JS에서는


function myfunc(){
}

myfunc()


이런식으로 사용해주게 되는데 이 조차도 myfunc()에 저장되기 때문에





(function(){
}())



이런식으로 익명함수의 형태로 사용해주는 경우가 많다
이는 library,모듈화를 쉽게 하는데 용이하다



만약 전역변수를 사용하려면?



var MyObject= {}

MyObject.calculator={
    'first': null,
    'second' : null
}



이런식으로 하나의 객체를 전역변수로 만들어서 사용하고 객체를 세부적으로 나누어 사용해줄 수 있다.


유효범위의 대상


JS에서는 for나 if안에서 선언해준것은 전역변수이다

즉 다른언어처럼 블록으로 묶였다고 해서 지역변수인게 아니다

오직 함수내에서만 쓰인변수가 지역변수이다


function a (){
    i = 0;
}
for(i = 0; i < 5; i++){
    a();
    document.write(i);
}



이렇게 하면 for문 안에서 선언된 i가 전역변수이고 for문이 돌때마다 a()가
i의 값을 0으로 초기화 시켜서 무한루프를 돌게 된다


static scoping(lexical scoping)


사용될때가 아닌 정의된 시점의 전역변수가 사용된다


var i = 5;

function a(){
    var i = 10;
    b();
}

function b(){
    document.write(i);
}

a();



이런 코드가 있을때 b()가 쓰이는 곳에따라서 다른 i를 가지게 된다면 이는 동적 유효범위일텐데

b()가 선언되는 순간 정의되기때문에 이는 정적 유효범위라고 해준다



출처 : 생활코딩

댓글 없음:

댓글 쓰기

가장 많이 본 글