[뉴렉처 6기] JavaScript│제어 구조 for-in, for-of│함수의 매개변수│전역변수와 지역변수│var│closure함수(230717)
목차
💙 들어가며
1. 남은 제어구조 for-in, for-of에 대해서 배우고 제어구조를 마무리하자.
2. 그리고 본격적으로 함수에 들어갈건데,
자바스크립트에서는 모든 것이 다 객체이기 때문에함수마저도 객체!라는 점에 유의하며
자바스크립트 함수의 특징과 지역변수에 대해서 알아보자.
✏️ 학습내용 정리
#인덱스를 세지 않아도 반복문을 돌릴 수 있다!
대부분의 제어구조는 친숙한 편이지만 for-in과 for-of가 조금 특이해보인다.
그 안의 내용을 조금 자세히 들여다보면
특히, for-in은 자바스크립트에만 있는 특이한 녀석의 느낌이다.
for-of는 자바의 for-each와 비슷한 녀석으로 이해할 수 있겠다.
💡 for-in: 배열의 갯수만큼 돈다. 값이 아니라 인덱스가 있는지 확인하고 꺼낸다. 💡 for-of: 자바의 for-each문과 비슷하다. 배열의 갯수만큼 돌면서 value을 꺼낸다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
다음과 같은 배열이 있을 때
사용하는 방법만 다를 뿐 모두 똑같은 결과를 얻을 수 있다.
💡 기본 for문
인덱스가 몇까지 있는지 찾아야한다.
인덱스를 names.length로 치환!
var names = ["철수", "영희", "맹구", "동천"];
for (var i = 0; i < names.length; i++)
console.log(names[i]);
=========================================
💡 for-in문
인덱스가 몇까지 있는지 찾아볼 필요 없다.
배열을 돌면서 인덱스(key)를 찾는다.
for (var i in names)
console.log(names[i]);
=========================================
💡 for-of문
인덱스를 아예 신경쓰지 않는다.
배열을 돌면서 바로 값을 찾는다.
for (var name of names)
console.log(name);
(참고로 여기서는 i를 선언할 때 var가 빠졌는데, 자세한 내용을 밑에서 다루니 일단 넘어가자!)
🚨 배열 중간중간에 빠진 부분이 있다면?
var names = [, "철수", "영희", "맹구", , "동천"];
💡 기본for문
for (i = 0; i < names.length; i++)
console.log(names[i]);
=========================================
💡 for-in문
for (i in names)
console.log(names[i]);
=========================================
💡 for-of문
for (name of names)
console.log(name);
for-in은 배열의 빠진 부분에 대해서는 인덱스가 없는 것으로 인식하고 출력하지 않는다.
배열이 아니라 객체라면 어떻게 달라질까?
객체로 한다면 배열처럼 index를 찾기가 더 어려워진다.
(애초에 객체를 반복시킨다는 개념도 좀 특이한 것..)
💡 객체에서 for, for-in과 for-of는 될까?
var exam = { kor: 10, eng: 20, math: 30 };
for (i = 0; i < exam.length; i++)
console.log(exam[i]);
for (var att in exam)
console.log(att + ":" + exam[att]);
for (var value of exam)
console.log(value);
💡 지역 안에서 함수이름과 변수이름이 중복되면 오류가 난다.
몇 번을 강조하지만 기억할 점은 함수도 객체이다!
그래서 함수가 아니라 변수와도 중복이 될 수 있다.
변수명과 함수이름은 중복되지 않게 해야한다.
{
변수이름 add 문제 없음
var add = new Function("x, y", "return x+y;");
console.log(add(3, 4));
변수이름 add 문제 없음
var add = function (x, y) { return x + y; };
console.log(add(3, 4));
함수이름 add 변수와 중복이라면서 에러나옴
function add(x, y) { return x + y; };
console.log(add(3, 4));
}
그래서 사실상 함수를 정의할 때 인자가 필요가 없다. 어짜피 arguments에 쌓이니까.
💡 다음을 실행하면?
var add = function () {
console.log("arguments:" + arguments.length);
var x = arguments[0];
console.log(x);
var y = arguments[1];
console.log(y);
var sum = 0;
for (var arg of arguments)
sum += arg;
return sum;
}
console.log(add(2, 3, 4, 5));
💡 h를 출력했을 때 window에 a와 k와 h는 보일까?
window.alert("aa");
console.log(window.a);
a = 2;
for (var k in window)
console.log(k);
for (h in window)
console.log(h);
#지역변수의 특징
자바스크립트에서는 지역화가 거의 의미가 없었지만,
유일하게 지역화가 되는 것이함수 안에서 선언하는 경우이다.
💡 함수 안에서 지역변수는 hoisting으로 인해서 최 우선순위가 된다.
함수의 지역 안에서 객체를 선언(var)하지 않고 쓰면 무조건 전역객체(window)의 속성으로 들어간다. 반대로 선언(var)을 하게 되면 지역변수가 되고, 이 지역변수는 함수의 지역 안에서 가장 최 우선순위가 된다.
만약 함수 안에서 선언(var)을 안하고 변수를 쓰면
자동으로 전역 객체의 속성을 띄면서 window안에 들어간 속성을 쓰는 것으로 인식이 된다.
그런데 밑에서 var라고 변수를 선언한 동일 이름의 변수가 하나라도 있으면
지역변수가 생기고 그 것이 최 우선순위가 된다.
다음의 예제를 풀어보자.
💡 다음을 출력하면 어떤 팝업이 뜰까?
var f1 = function () {
a = 1;
console.log(window.a);
var a;
a++;
alert(a);
alert(window.a);
}
f1();
💡 다음을 출력하면?
function f1() {
var a = 1;
console.log(a); // 1
function f2() {
a = 10;
a++;
console.log(a); // 2
}
f2();
console.log(window.a); // 3
}
f1();