[JavaScript] ES6 chap.1
this
1. 아무데서 쓰거나 일반 함수에서의 this는 window
<script>
console.log(this); // Window
function 함수(){
console.log(this);
}
함수(); // Window
</script>
** use strict **
<script>
'use strict';
console.log(this); // Window
function 함수(){
console.log(this);
}
함수(); // undefined
</script>
2. object 자료형 안의 함수에서 this값은 오브젝트 그 자체
<script>
var 오브젝트 = {
data: "kim",
함수: function(){
console.log(this);
}
}
오브젝트.함수(); // { data : 'Kim', 함수 : f }
</script>
this값: 오브젝트 객체
<script>
var 오브젝트2 = {
data: {
함수: function(){
console.log(this);
}
}
}
오브젝트2.data.함수(); // { 함수 : f }
</script>
this값: data 객체
* window 객체
<script>
(1)
function 함수(){
console.log(this)
}
(2)
window.함수 = function(){
console.log(this);
}; <!-- window라는 오브젝트에 함수 자료를 추가 -->
<!-- (2)와 같은 의미
var window = {
함수: function(){
console.log(this);
}
}
실질적으로 window로 객체 변수를 선언하면 에러 남-->
</script>
- 2번의 뜻은 1번의 뜻과 상통한다. script라는 태그 자체안에 window라는 큰 객체(object)가 있는것이다.
3. constructor(생성자) 안에서 쓰면 constructor로 새로 생성되는 오브젝트
<script>
function 생성자(){
console.log(this);
}
new 생성자(); // 생성자 {}
</script>
this 값: 생성자 객체
<script>
function 생성자or함수(){
this.테스트 = "test";
console.log(this);
}
// 1번의 경우
new 생성자or함수(); // 생성자or함수 {테스트: kim}
// 3번의 경우
생성자or함수(); // Window
</script>
- 함수로 사용 했을시엔 window 객체를 가리키지만 new를 통해 생성자(constructor)로 만들게 되면 해당 function의 이름으로 새로운 object 객체를 만든다.
4. eventListener 안에서 쓰는 this는 e.currentTarget
<script>
document.getElementById('ID').addEventListener('click', function(e){
// == e.currentTarget
console.log(this); // document.getElementById('ID')
});
</script>
- 이벤트리스너 안에서의 this는 지금 이벤트가 동작하는 곳을 의미하며, e.currentTarget과 document.getElementById('ID')와 같은 의미이다.
** 가장 가까이 있는 함수에 따라 바뀌는 this
<script>
document.getElementById('버튼').addEventListener('click', function(e){
console.log(this); // document.getElementById('버튼') (4)
var 어레이 = [1,2,3];
어레이.forEach(function(){
console.log(this); // window, window, window (1)
});
});
var 오브젝트 = {
이름들 : ['김', '이', '박'],
함수 : function(){
console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
오브젝트.이름들.forEach(function(){
console.log(this); // window, window, window (1)
});
}
}
console.log(오브젝트.함수());
</script>
** function()과 arrow함수의 차이
<script>
var 오브젝트 = {
이름들 : ['김', '이', '박'],
함수 : function(){
console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
오브젝트.이름들.forEach(function(){
console.log(this); // window, window, window (1)
});
}
}
console.log(오브젝트.함수());
var 오브젝트2 = {
이름들 : ['김', '이', '박'],
함수 : function(){
console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
오브젝트2.이름들.forEach( () => {
console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
});
}
}
console.log(오브젝트2.함수());
</script>
ES6에선 function(){} 대신 () => {} 라는 arrow function 문법이 있는데, 둘의 차이는 함수 내부의 this 값을 새로 바꿔주지 않기 때문에(=바깥에 있던 this값을 내부에서 그대로 사용) this를 사용하기 유용하다.
Arrow function
<script>
var x = function(){} // 기존 함수
var y = () => {} // arrow 함수
</script>
* 사용법
<script>
var 두배만들기 = (x) => { return x * 2 }
console.log( 두배만들기(4) );
var 두배만들기 = x => x * 2 ;
console.log( 두배만들기(8) );
</script>
- 파라미터가 하나면 중괄호 생략이 가능하고 return 값도 한 줄이면 중괄호와 return도 생략 가능하다.
* arrow function에서의 this
<script>
var 오브젝트1 = {
함수 : function(){
console.log(this)
}
}
오브젝트1.함수(); // { 오브젝트1: 함수f }
var 오브젝트1 = {
함수 : () => { console.log(this) }
}
오브젝트1.함수(); // window
</script>
arrow function은 외부에 있던 this를 그대로 내부로 가져와서 사용한다.
var, let, const
* var
- 재선언 (o)
- 재할당 (o)
- 범위: function
var 이름 = 'kim';
이름 = 'lee' // (o)
var 이름 = 'kim'; // (o)
function(){
var 테스트 = 'test';
테스트 // (o)
}
테스트 // (x)
* let
- 재선언 (x)
- 재할당 (o)
- 범위: {}
let 이름 = 'kim';
이름 = 'lee' // (o)
let 이름 = 'kim'; // (x)
if(1 == 1){
let 테스트 = 'test';
테스트 // (o)
}
테스트 // (x)
* const
- 재선언 (x)
- 재할당 (x)
- 범위: {}
const 이름 = 'kim';
이름 = 'lee' // (x)
const 이름 = 'kim'; // (x)
if(1 == 1){
const 테스트 = 'test';
테스트 // (o)
}
테스트 // (x)
const 오브젝트 = { 이름 : 'Kim' }
오브젝트.이름 = 'Park'; //가능
const 변수를 쓴다고 하더라도 const로 선언된 변수의 자료 형이 object 형이라면 안에 있는 값을 변경 할 수 있다. 변경 불가능한 값을 만드려면 Object.freeze()라는 기본 함수를 사용하면 된다.
호이스팅, 클로저
- 호이스팅
<script>
// var 이름;
console.log(이름); // undefined
var 이름 = 'Kim'; // 이름 = 'kim;
console.log(이름); // kim
</script>
var 변수를 사용하게되면 (var 변수) 선언 부분은 맨 위로 올리고 (변수 = 값)만 그 자리에 남게되는데 이런것을 호이스팅이라고 한다. (함수 또한 호이스팅 가능하다.)
- 클로저
var 나이 = 20;
function 함수(){
console.log(나이)
}
함수();
클로저는 바깥에 있는 변수는 안쪽에서 자유롭게 사용할 수 있다는 것을 의미한다. 이것을 참조가능하다라고도 한다. 함수 안쪽에 나이라는 변수가 있다면 그것을 사용하겠지만 없으면 바깥에 있는 변수를 사용한다.
Template literals
따옴표 대신 backquote, backtick 이라는 '`' 기호를 사용하여 문자를 만드는 법이다.
: 장점
- 문자 중간 엔터키 입력가능
- 문자 중간 변수를 집어넣을 때 편리
var 문자 = `안녕
하세요`;
var 이름 = '손흥민';
var 문자 = `안녕하세요 ${이름} 입니다`;
* Tagged Literals
- 문자 해체분석
var 변수 = '손흥민';
function 해체분석기(문자들, 변수들){
console.log(문자들);
console.log(변수들);
}
해체분석기`안녕하세요 ${변수} 입니다`; // () 대신에 이런식으로 사용 가능하다.
// 문자열 값: [안녕하세요, 입니다]
// 변수 값: 손흥민
spread operator
- 괄호를 제거해주는 연산자 (함수/소괄호, 오브젝트/중괄호, 어레이/대괄호에서 사용)
var 어레이 = ['hello', 'world'];
console.log(어레이); // ['hello', 'world']
console.log(...어레이); // hello world
- 문자의 경우
var 문자 = 'hello';
console.log(문자[0]); // h
console.log(문자[1]); // e
console.log(문자); // hello
console.log(...문자); // h e l l o
* 합치기 / 복사
// Array
var a = [1,2,3];
var b = [4,5];
var c = [...a, ...b]; // [1, 2, 3, 4, 5]
// Object
var o1 = { a : 1, b : 2 };
var o2 = { c : 3, ...o1 }; // { a: 1, b: 2, c: 3}
: 합치기
var a = [1,2,3];
var b = a;
console.log(a);
console.log(b);
var object1 = {a: 1, b: 2};
var object2 = object1;
console.log(object1);
console.log(object2);
: 복사
등호(=)를 이용하여 쉽게 Array와 Object의 값을 복사 할 수는 있지만 참조 값 타입의 변수를 등호(=) 방식으로 복사 하게되면 값 공유가 일어난다. 때문에 복사되어진 값과 복사한 값의 값 변경이 같이 일어나기 때문에 올바른 복사 방식은 아니다.
var a = [1,2,3];
var b = [...a];
console.log(a);
console.log(b);
var object1 = {a: 1, b: 2};
var object2 = {...object1};
console.log(object1);
console.log(object2);
: spread를 통한 복사 방식
값 변경이 일어나도 서로의 값에 영향을 주지 않는다.
* 만약 spread를 통한 복사를 했을 때, 중복되는 값이 있다면 ??
var o1 = { a : 1, b : 2};
var o2 = { a : 3, ...o1 };
console.log(o2); // {a: 1, b: 2}
중복된 값이 있다면 기존의 값에 새롭게 들어온 값으로 저장된다.
apply, call
array를 파라미터 형태로 집어넣고 싶을 때 사용한다.
function 더하기(a,b,c){
console.log(a + b + c)
}
더하기(1,2,3); // 6
var 어레이 = [10, 20, 30];
더하기(어레이[0], 어레이[1], 어레이[2]); // 60 주먹구구
더하기.apply(undefined, 어레이); // 60 옛날방식
더하기(...어레이); // 60 요즘방식
var person = {
인사 : function(){
console.log(this.name + '안녕')
}
}
var person2 = {
name : '손흥민'
}
person.인사.apply(person2);
person.인사.call(person2);
어떤 함수(person)를 실행하는데 다른 오브젝트(person2)에다가 적용해서 실행할 때 사용한다.
person.인사.apply(person2, [1,2,3]); // array 형태
person.인사.call(person2, 1,2,3); // 일반 형태
apply와 call의 사용법과 결과는 똑같지만 함수에 파라미터를 넣어서 실행할 때, apply는 array[] 형태로, call은 일반 함수처럼 파라미터를 전달한다.
'JavaScript' 카테고리의 다른 글
[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수) (0) | 2022.03.29 |
---|---|
[JavaScript] ES6 chap.3 (0) | 2021.12.02 |
[JavaScript] ES6 chap.2 (0) | 2021.11.30 |
[JavaScript] Chap.2 (0) | 2021.11.25 |
[JavaScript] Chap.1 (0) | 2021.11.19 |