
var num1 = 20;
function levelOne() {
console.log(num1);
}
levelOne();
// result > 40
function levelOne() {
var num1 = 40;
console.log(num1);
}
levelOne();
// result > 40
console.log(num1);
// result > 20
function levelOne() {
var num1 = 40;
function levelTwo() {
var num2 = 99;
console.log(`levelTwo num2 : ${num2}`);
// 바로 상위 scope 에있는 num1 출력 (20이 아닌 40 출력)
console.log(`levelTwo num1 " ${num1}`);
}
levelTwo();
// 현재 함수 scope 에있는 num1 출력 (20이 아닌 40 출력)
// => 모든 선언은 가장 가까운 scope 에 있는 선언부터 활용
console.log(`levelOne num1 : ${num1}`);
}
levelOne();
console.log(num1); // result > 20
console.log(num2); // ReferenceError: num2 is not defined
🧷 Lexical Scope
: 선언된 위치가 상위 스코프를 정함
↔Dynamic scope: 실행한 위치가 상위 스코프 결정
JS 는 lexical scope를 사용하기 때문에 함수의 상위 스코프가 정의 시점에 평가
var num3 = 3;
function functionOne() {
var num3 = 100;
funtionTwo();
}
function funtionTwo() {
console.log(num3);
}
functionOne();
functionOne 에서 실행했으니까 100을 가져올 것인가?
global scope에 있는 3을 가져올 것인가?
=> global scope 에서 값 가져옴result : 3
for문, if문 등은 새로운 scope를 만들지 않음global scope 로 변경됨var 키워드 로 선언시 scope 가 생기는 것은 함수일 때만 var i = 999;
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(`i in global scope : ${i}`);
i = 999;
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(`i in global scope : ${i}`);
💡 요약
var키워드는함수 레벨 스코프만만듦
let, const키워드는함수 레벨 스코프와블록 레벨 스코프를 만들어냄
const testFinction = function () {
return this;
}
console.log(testFinction());
const yujin = {
name: '안유진',
year: 2003,
sayHello: function () {
return `안녕하세요 저는 ${this.name}입니다!`;
}
}
console.log(yujin.sayHello());
function Person(name, year) {
this.name = name;
this.year = year;
this.sayHello = function () {
return `안녕하세요 저는 ${this.name}입니다!!`;
}
}
const yujin2 = new Person('안유진', 2003);
console.log(yujin2.sayHello());
this 가 실행하는 객체로 자동으로 매핑됨Person.prototype.dance = function () {
return `${this.name}이 춤을 춘당`;
}
console.log(yujin2.dance());
Person.prototype.dance = function () {
function dance2() {
return `${this.name}이 춤을 춘당`;
}
return dance2();
}
console.log(yujin2.dance());
💡
this키워드가 어떤 걸 가르키냐는 세가지만 기억할 것!!
1. 일반 함수가 호출할 땐 this가 최상위 객체 (global 또는 window)를 가리킴
2. 메서드로 호출할 때 호출도니 객체를 가리킴
3. new 키워드를 사용해 객체를 생성했을 때 객체를 가리킴
=> 2, 3이 아닌 경우 1임
💡
this를 원하는 값으로 매핑하는 방법
1. call()
2. apply()
3. bind()
function returnName() {
return this.name;
}
console.log(returnName());
const yujin3 = {
name: '안유진'
}
console.log(returnName.call(yujin3));
console.log(returnName.apply(yujin3));
👩💻
call()과apply()의 차이는 무엇인가?
call()-> 콤마를 기반으로 argument 를 순서대로 넘겨줌
apply()-> argument 를 리스트로 입력해야함
공통점 ) 실행하는 순간 바로 계산
function multiply(x, y, z) {
return `${this.name} / 결과값 : ${x * y * z}`;
};
console.log(multiply.call(yujin3, 3, 4, 5));
console.log(multiply.apply(yujin3, [3, 4, 5]))
this 바인딩 한 후, 나중에 실행가능const lateFunc = multiply.bind(yujin3, 3, 4, 5);
console.log(lateFunc);
console.log(lateFunc());
Execution Context 크게 두 개로 나뉨
1. Global context
: 최상위 Execution Context
코드 실행시 무조건 생성되는 context로 웹에서의 window 객체나 nodeJS 에서의 global 객체를 생성하고 들고있음
2. Function Context
: 함수가 실행될 때마다 함수별로 실행되는 context.
함수 실행에 대한 모든 정보를 갖고 있음

function getNumber() {
var number = 5;
function innerGetNumber() {
return number;
}
return innerGetNumber;
}
const runner = getNumber();
console.log(runner);
console.log(runner());
👩💻 어떤 점이 유용 ?
function cacheFuntion(numNumb) {
// 아래 계산은 매우 오래걸린다는 가정을 했을 때
// 반복적으로 계속 작업해야함 => 비표율적
var number = 10 * 10
function innercarhceFunction(newNumb) {
return number * number;
}
return innercarhceFunction;
}
const runner2 = cacheFuntion();
console.log(runner2(10));
function cacheFuntion2() {
var number = 99;
function increment() {
number++;
return number;
}
return increment;
}
const runner3 = cacheFuntion2();
console.log(runner3());
console.log(runner3());
function Idol(name, year) {
this.name = name;
var _year = year;
this.sayNameAndYear = function () {
return `안녕하세요. 저는 ${this.name} 입니다. ${_year} 년에 태어났습니다.`
}
}
const yujin = new Idol('안유진', 2003);
console.log(yujin.sayNameAndYear());
console.log(yujin.name);
console.log(yujin._year);