[JS] 31. 자바스크립트의 변수
1) global 변수
var f1 = function(){
a= 1;
var a;
alert(a);
alert(window.a);
}
-
결과는 undefined가 나온다. / alert(a)는 1이 나온다.
-
function 안에서는 변수를 선언하기 전(a=1;까지)에는 a는 전역변수에 들어가는 속성인데
변수를 선언한 이후에는 1을 대입한게 의미가 없어진다. (전역변수가 아니게 된다.)
-
그래서
alert(window.a);
는 지역변수를 활용하게 된다.우선순위가 var가 먼저 인식되면서 a=1;이 지역변수가 된다.
window.a
에서 a는 전역변수 var a에서 a는 지역변수이다.
var f1 = function(){
a= 1;
var a;
a++
alert(a);
alert(window.a);
}
alert(a);는 2가 나온다.
-
동일한 변수를 여러 번 선언하는 경우
둘다 전역변수이다.
에러가 나야 정상인데 안난다.
var a = 1;
var a = 2;
alert(a);
-
중괄호를 사용하는 경우
결과는 1이 나온다.
변수를 중괄호를 사용해 선언하는 경우, 자바스크립트에선 중괄호가 아무 의미없다.
{
var a = 1;
}
alert(a);
- 결과는 undefined가 나온다.
alert(a);
{
var a = 1;
}
2) global 변수와 지역변수
function f1(){
var a = 1;
}
f1();
alert(a);
-
함수 안에서의 변수
에러가 발생한다.
function f1(){
a = 1;
}
f1();
alert(a);
-
여기서 a는 전역변수이므로 결과로 1이 나온다.
함수 안에서 선언한 global 변수
function f1(){
var a = 1;
f2();
function f2(){
var a = 2;
f3();
function f3(){
var a = 3;
}
console.log(a);
}
}
f1();
-
console.log(a);는 3이 출력,
var a = 3;이 없다면 2가 출력,
var a = 2;가 없다면 1이 출력된다.영역 안에서는 전역변수가 된다.
function f1(){
var a = 1;
f2();
function f2(){
a = 2;
f3();
function f3(){
console.log(a);
console.log(window.a);
}
}
}
f1();
-
console.log(a);
는 2가 나오고console.log(window.a);
는 undefined가 나온다.그러므로 a = 2;는 전역변수가 아니다.
같은 이름으로 밖에 있으면 전역변수가 안된다.
-
의도했던게 전역변수라면 전역 객체를 써주는게 좋다.
a = 2;를
window.a=2;
로 써주자. -
바깥에 있는 inner function 때문에 메모리에서 소거가 안되는 문제가 있다.
3) 클로저
function f1(){
var a = 1;
return a;
}
var a = f1();
alert(a);
- return a 에서 a는 객체이다.
-
function f1 안에는 primitive type이므로 return a에서 a는 객체이지만
참조가 아닌 값이 반환된다.
그리고 var a = 1;에서 1이 다시 박스가 되어 a가 1을 참조한다.
return a가 되는 순간 function f1()안에는 전부 사라진다.
function f1(){
var a = 1;
return function f2(){
return a;
}
}
var f = f1();
var a = f();
alert(a);
-
function f2는 객체여서 반환하는데 문제는 없는데
여기서 a는 자기 지역변수가 아닌 f1의 var a = 1; 을 사용한다.
f1에서 return 되면 사용한 자원이 사라져야 하지만 f2의 return a;때문에 f1의 자원들이 사라지지 못한다.
f2는 f1(outer function)을 닫게할 것이냐 아니냐를 결정하는 키가 된다. 이 리턴되는 function을 클로저(Closure)라고 한다.
즉, outer에 잇는 변수를 씀으로써 outer가 사라지는 것을 못하게 하는 것이 클로저이다.
function f1(){
var a = 1;
return function(){
console.log(a);
return a;
}
}
var closurefunction = f1();
closurefunction();
closurefunction = null;
- closurefunction = null;로 가비지컬렉터가 수거 -> f1() 스택도 같이 사라진다.
4) 함수 객체
-
함수도 간단하게 전달 가능하다.
-
함수는 객체이기 때문에 함수의 인자로 전달 가능.
-
print의 function()이 전달되고 있는 인자이다.
-
정렬 기준을 sort한테 전달할 수 있다.
1)
var nums = [4,7,3,1,6,3,2,11,9];
console.log(nums);
nums.sort();
console.log(nums);
2)
var nums = [4,7,3,1,6,3,2,11,9];
console.log(nums);
nums.sort(function(a, b){
return a - b; //오름차순 b-a는 내림차순, 0이면 그대로
});
console.log(nums);
3)
var exams = [{kor:10, eng:30}, {kor:32, eng:42}, {kor:19, eng:90}];
console.log(exams);
exams.sort(function(a, b){
return kor.a - kor.b; // 원하는 기준으로
});
console.log(exams);
5) 자바 스크립트 자료형식의 종류
- Primitive wrapper type(기본형), Reference type
-
typeof는 primitive wrapper type(기본형)을 위한 연산자이다.
기본형 외에는 object로 나온다.
- instanceof는 reference type을 위한 연산자이다.
-
주의 해야할 연산들
1) object가 아닌데도 object가 나온다.
2) 둘 다 false이기 때문에 true
3) false -
Array만 가지는 검증 방법은 isArray 이다.
-
int형의 경우 비트가 모자라 overflow 될 가능성이 높다. (엉뚱한 숫자가 나온다.)
끝에 n을 붙이면 큰 정수형, BigInt형을 나타낼 수 있다.
Author And Source
이 문제에 관하여([JS] 31. 자바스크립트의 변수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@psh94/JS-31저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)