오늘 댓글 수정/등록 기능 구현하다가 this 때문에 발생한 TroubleShooting 정리...🤔
# 문제상황
처음에 이렇게 작성했는데 this가 undefined로 나옴
// 수정/등록 버튼 클릭 이벤트
$("#btnSaveEdit").on("click", function(e) {
saveComment(true); // 수정 모드
});
$("#btnSave").on("click", function(e) {
saveComment(false); // 신규 작성 모드
});
// 댓글 저장 함수
function saveComment(isEdit) {
var content = isEdit
? $(this).closest("tr").find(".comment-edit").val() // 여기서 this가 undefined
: $("#commentContent").val();
// ... 나머지 로직
}
# 원인
콜백함수로 전달될 때 this의 컨텍스트가 달라짐.
이벤트 핸들러 안에서의 this는 이벤트가 발생한 요소를 가리키는데,
그 this를 다른 함수에 그냥 넘기면 컨텍스트가 바뀌어서 undefined가 됨
# 해결방법
이벤트가 발생한 요소(this)를 파라미터로 전달해서 사용
$("#btnSaveEdit").on("click", function(e) {
saveComment(true, this); // 클릭된 요소를 전달
});
$("#btnSave").on("click", function(e) {
saveComment(false, this);
});
function saveComment(isEdit, element) {
var $btn = $(element); // jQuery 객체로 변환
var content = isEdit
? $btn.closest("tr").find(".comment-edit").val()
: $("#commentContent").val();
// ... 나머지 로직
}
# 다른 해결 방법들
1. bind() 사용
saveComment.bind(this, isEdit)
2. 화살표 함수 사용 (this가 렉시컬 스코프를 유지)
const saveComment = (isEdit) => {
// this가 상위 스코프의 this를 그대로 사용
}
# 주의사
- 콜백함수에서 this 사용할 때는 항상 컨텍스트 확인하기
- 제일 간단한 방법은 그냥 파라미터로 넘기기
- this 바인딩 방식은 상황에 따라 선택
이거 때문에 한참 걸렸다... 다음에는 바로 파라미터로 넘겨야지 😅
'개발노트 > TroubleShooting' 카테고리의 다른 글
[Spring] 다국어 처리 시 locale이 제대로 처리되지 않는 문제 (2) | 2025.02.13 |
---|---|
[JavaScript] 게시판 첨부파일 삭제 시 atchFileId가 계속 남아있는 문제 (2) | 2025.01.21 |
[jQuery] 동적 요소에 이벤트 바인딩이 안 될 때 해결법 (+ event delegation) (0) | 2025.01.18 |
[Spring] jqGrid 검색 기능 구현 중 발생한 오류들 정리 (1) | 2025.01.14 |
[Spring] jqGrid 데이터 연동 시 500에러 해결 (feat. @RequestBody) (0) | 2025.01.13 |