화살표 함수를 쓰면서 너무너무 재밌고, 간편하게 쓰고 있었는데
이런 함수에서도 사용할수 없는 문법이 있다.
신기하기도 하면서 잊어버리지 않기 위해서 정리해둔다.
const test = (arg) =>{
const plusSum = arg + "님, 반가워요";
return plusSum;
}
[ 화살표함수의 예시 ]
바로 this 함수이다.
쓸수 없는 이유는 바로, 해당함수가 지정하는 범위가 달라지기 때문이다 .
예시를 보자.
버튼을 누르면 버튼글씨가 변경되는 간단한 예제다.
const btn = document.querySelector("button");
btn.onclick = function () {
this.innerText = "바뀌어요"; //여기서 this는 바로 상위의 버튼을 가리킴.
};
this 함수는 호출에 따라서 어떤 객체를 참조하는 지 (binding:바인딩) 달라지게 된다.
현재 예제에 따르면 나는 button 객체를 참조하게 호출하였고, this = button 을 가르키는 것을 알 수 있다
여기까지가, 기본적으로 알고 있는 함수이며 가장 널리 쓰이는 this의 방식이다.
만약, 해당 함수를 화살표함수로 변경하면 어떤값이 나오게 될까?
먼저 기본 함수를 했을 때 this가 어떤 객체를 참조했는지 확인을 해보자.
const btn = document.querySelector("button");
btn.onclick = function() {
console.log(this);
};
결과)
딱!! 버튼을 참조한다고 보여진다.
그렇담 화살표함수로 바뀐다면??
const btn = document.querySelector("button");
btn.onclick = () => {
console.log(this);
};
결과)
버튼을 참조한다는데 화살표 함수로 바꿨는데 왜 갑자기 버튼을 참조하지 못하지??
그건 참조대상이 button -->> window로 바뀌었기 때문이다 ( 버튼하나만 참조하다가 갑자기 전체를 참조한다고??)
그 이유는 화살표 함수에서 this를 선언하게 되면
기본 this 가 참조되는 방식을 써서 참조되는게 아니라 무조건 언제나 상위 범위(scope)를 참조하기 때문이다.
button(버튼) << window 이기 때문에 화살표함수에 쓰인 this 는 윈도우를 참조하게 된다.
그러면 버튼이 다른 태그로 감싸고 있다면 window를 참조할까?
방금 위쪽에 설명하기로 무조건 언제나 상위 범위를 참조한다고 했으니까!
답은 하단에 정말 깔끔하게 나와서 인용한다.
' this는 상위 환경의 this를 계승하므로 전역 객체를 가리키게 되는 것이다'
출처: https://kim-solshar.tistory.com/57 [김솔샤르의 인사이트]
편리하긴 하지만, 내가 원하는 범위로 쓸수 없으니 신기하기도 하면서 답답하기도 함.
참조
https://programmer-seva.tistory.com/28
[스터디_자바스크립트] 15. 함수 호출과 this
자바스크립트에서 함수를 호출할 때 기존 매개변수로 전달되는 인자값에 더해, arguments 객체 및 this 인자가 함수 내부로 암묵적으로 전달된다. this 인자는 자바스크립트의 여러 가지 함수가 호출
programmer-seva.tistory.com
[JS] 자바스크립트에서의 this
this는 이것을 뜻합니다! (그러니까 '이게' 뭐죠...... 😵) 자바스크립트 내에서 this는 '누가 나를 불렀느냐'를 뜻한다고 합니다. 즉, 선언이 아닌 호출에 따라 달라진다는 거죠. 그럼 각 상황별로 th
nykim.work
https://velog.io/@juno7803/JS-this%EC%99%80-arrow-function
[JS] this와 arrow function
🎯 this와 arrow function을 정리하였습니다 :)
velog.io
https://kim-solshar.tistory.com/57
[자바스크립트] arrow function과 this
ecmascript6가 나온지는 한참됐지만 아직 브라우저(특히 ie)들이 이를 완벽히 지원하지 않고 있다. 따라서 현재도 여전히 es5에서 es6+로 넘어가는 과도기인데, 다행히 babel의 도움으로 지금 당장 es6
kim-solshar.tistory.com
+ 사담
날이갈수록 이해하고 이걸 풀어써서 정리하는 것에 큰 괴리감이 든다.
블로그에 열심히 정리하시는 모든 분들께 대단하다고 말씀드리고 싶다.
더불어 꾸준히 관리하는 것도 대단하다고 생각함 : )
'JAVASCRIPT' 카테고리의 다른 글
니꼬샘 자바스크립트 강의 : padStart, padEnd (feat. 숫자채우기) (0) | 2022.01.19 |
---|---|
서버에 데이터를 꼭 저장해야 할 필요가 없다면? : webStorage (0) | 2022.01.17 |
Conditionals 확실히 알고있어? : 헷갈리는 개념 복습! (0) | 2022.01.12 |
'use strict'을 발견했다면? : strict모드에 관하여 (0) | 2022.01.10 |
니꼬샘 ES6의 정석 강의 미리보기: var를 사용하면 안되는 이유(최종판) (0) | 2022.01.07 |