실행되는 환경 : browser, nodejs(로컬)
javascript engine은 코드가 없으면 세가지 변수를 초기화하게된다.
코드가 실행되는 시점의 환경이 가리키는 객체(window).
window는 브라우저에서 글로벌 최상위단의 스코프에 존재하는 객체
아무 변수가 없으므로 빈 객체가
연결된 스코프가 없어서 빈 객체
function myFunc(){
let a = 10;
let b = 20;
function add(first, second){
return first + second
}
return add(a, b);
}
실행 컨텍스트가 쌓이면서 스택이 구성된다.
let o = {
name: 'Daniel',
method: function(number) {
return this.name.repeat(number);
}
}
function myFunc(){
let = 10;
return o.method(n);
}
객체의 매서드 호출시 this가 그 객체를 가리킨다
this : o
this가 가리키는 것은 컨텍스트에 따라 변할 수 있다.
함수 직접 호출.
myFunc();
객체의 메서드 호출
o.method();
생성자 함수를 호출. 생성자 함수 내부의 this는 new
키워드를 통해 앞으로 만들어질 인스턴스 객체를 가리킵니다.
function Person(){
this.name = 'abc';
}
const p = new Person();
call, apply 함수 객체의 메서드를 상속받음. setTimeout으로 함수의 실행 환경을 바꾼다.
setTimeout(p.printName.bind(p)) //bind는 특정 this변수 객체를 메서드에 묶어줌
//this값이 p를 가리키도록 바인드해줌
특정 동작 이후 불려지는 함수. 보통 다른 함수의 인자로 보내지는 함수
dynamic binding : 다양한 환경에서 호출되는 함수는 환경에 따라 this가 동적으로 세팅된다.
클로저를 사용하는 이유는 상태를 안전하게 은닉하고 보존시키기 위함입니다.
그리고 이를 수정하는 방법은 특정 함수한테만 그 권한을 줍니다.
즉, 다수의 개발자와 함께 일을 할 때 실수를 방지하고 더 탄탄한 코드를 만들기위한 코드 패턴입니다.
따라서 다음과 같이 클로저를 만들어 사용합니다.
function createCard() {
let title= "";
let content= "";
function changeTitle(text) {
title= text
}
function changeContent(text) {
content= text
}
function print() {
console.log("TITLE -", title);
console.log("CONTENT -", content);
}
return { changeTitle, changeContent, print};
}
createCard 함수 본문에 있는 title, content 변수는 외부에서 접근할 수 없습니다.
따라서 changeTitle, changeContent 함수를 통해 수정할 수 있도록 해주었습니다.
값을 읽을 수 있도록 제공하는 함수는 print로 해주었습니다.
그리고 이 모든 함수를 객체로 묶어서 createCard 함수에서 return 합니다.
const myCard = createCard()
와 같은 형태로 인스턴스를 만들어서 사용할 수 있습니다.
함수의 인자, 배열, 객체 중 나머지 값을 묶어 사용하도록 한다
함수의 인자들을 하나의 배열로 묶는다
function findMin(...rest){
return res.reduce((a, b)=> a<b ? a : b);
}
findMin(7,3,2,1,5);
지정된 필드 외의 나머지 필드를 객체로 묶는다.
const o = {
name: 'name',
age: 21,
address: 'building',
job: 'cheif'
}
const {age, name, ...rest} = 0;//rest {address: ~ , job : ~}
findSamePerson(age, name);
나머지 인자를 다시 배열로 묶는다. 아래 코드에서 tail변수는 첫 번째 원소 head를 제외한 나머지 값들을 다시 배열로 묶는다. tail은 하나씩 줄어들게 되며 길이가 0이되면 합을 반환
function sumArray(sum, arr){
if(arr.length === 0)return sum;
const[head, ...tail] = arr;
return sumArray(sum + head, tail);
}
spread operator의 등장 순서에 따라, 객체의 필드가 덮어 씌워 질 수 있다.
...o가 뒤에 등장하면 기존의 name필드가 나중에 등장하여 앞의 name: "Tom" 을 덮어 씌운다
const o = {
name: 'name',
age: 21,
address: 'building',
job: 'cheif'
}
const new_obj = {...o, name: "Tomas", age:13 }
const new_obj2 = {name: "tomas", age:13, ...o}
...Object.values
는 객체 값들의 배열을 반환한다.
//o = { a : 1, b:2, c:3}
function findMinInObject(o){
return Math.min(...Object.values(o))
}