
오늘은 알고리즘 강의 첫날!
더 많은 사람들이 있다보니 다양한 풀이 방식을 볼 수 있어서 좋았다. 특히 cnt++로 수를 점차 증가시키는 것, for만 쓰지 말고 while도 써보는 연습을 해보자고 반성할 수 있었다.
실행 컨텍스트 객체의 실체(담기는 정보)
VariableEnvironment(VE): snapshot 가짐
LexicalEnvironment(LE): 실시간으로 변경사항 반영(코드 실행x)
-> record, 호이스팅
function a (x) {
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
와
function a () {
var x;
var x;
var x;
x = 1;
console.log(x);
console.log(x);
x = 2;
console.log(x);
}
a(1);
의 출력은 모두 1, 1, 2이다.
마찬가지로
function a () {
console.log(b);
var b = 'bbb';
console.log(b);
function b() { }
console.log(b);
}
a();
와
function a () {
var b; // 변수 선언부 호이스팅
function b() { } // 함수 선언은 전체를 호이스팅
console.log(b);
b = 'bbb'; // 변수의 할당부는 원래 자리에
console.log(b);
console.log(b);
}
a();
역시 똑같은 b함수, ‘bbb’, ‘bbb’가 출력된다.
-> 함수 선언문, 함수 표현식
ThisBinding: this 식별자가 봐야할 객체(바로 아래에서 정리)

(1) 상황에 따라 달라지는 this
var obj1 = {
outer: function() {
console.log(this); // (1)
var innerFunc = function() {
console.log(this); // (2), (3)
}
innerFunc();
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod();
}
};
obj1.outer();
에서 (1)은 obj, (2)는 전역, (3)은 obj2인데 점이나 대괄호의 유무로 메서드인지 함수인지 알 수 있고, 이를 통해 this가 무엇인지 알 수 있다.
(2) 명시적 this 바인딩
2-1. call 메서드
var func = function (a, b, c) {
console.log(this, a, b, c);
};
// no binding
func(1, 2, 3); // Window{ ... } 1 2 3
// 명시적 binding
// func 안에 this에는 {x: 1}이 binding돼요
func.call({ x: 1 }, 4, 5, 6}; // { x: 1 } 4 5 6
2-2. apply 메서드
: this에 binding할 객체는 똑같이 넣어주고 나머지 부분만 ⭐배열 형태로 넘겨준다.
var func = function (a, b, c) {
console.log(this, a, b, c);
};
func.apply({ x: 1 }, [4, 5, 6]); // { x: 1 } 4 5 6
var obj = {
a: 1,
method: function (x, y) {
console.log(this.a, x, y);
}
};
obj.method.apply({ a: 4 }, [5, 6]); // 4 5 6
2-3. call, apply 메서드의 활용
function Person(name, gender) {
this.name = name;
this.gender = gender;
}
function Student(name, gender, school) {
Person.call(this, name, gender); // 여기서 this는 student 인스턴스!
this.school = school;
}
function Employee(name, gender, company) {
Person.apply(this, [name, gender]); // 여기서 this는 employee 인스턴스!
this.company = company;
}
2-4. bind 메서드
: 즉시 호출하지 않고 넘겨받은 this 및 인수들을 바탕으로 새로운 함수 반환, 부분 적용 함수 구현할 때 용이
2-5. 화살표 함수의 예외 사항
: 함수 내부에는 this의 할당과정이 아예 없으며, 접근하고자 하면 가장 가까운 this에 접근