도대체 이게 뭐야?JavaScript의 this 키워드 보기
12989 단어 frontendwebdevtutorialjavascript
이게 어떻게 된 일입니까?이것은 근본적으로 아무런 의미가 없다.모든 사람은 생활 속의 어느 때 자신에게 이런 문제를 묻기 때문에 우리는 이 논쟁을 해결하고 이 수수께끼를 철저히 풀자.만약 당신이 아직 이해하지 못한다면, 이 이야기는 자바스크립트의 무서운
this
키워드에 관한 것이다.우선
this
이 무엇인지 정의합시다.The “this” keyword in JavaScript refers to the object it belongs to.
콘솔을 열고 "this"를 쓰십시오.이런 상황에서'this'자체는 전체 국면의 대상을 가리킨다.브라우저의 글로벌 객체는 창 자체입니다.
첫 번째 예
지금, 만약 우리가 자신의 목표가 있다면?다음과 같은 상황에서 출력은 무엇이라고 생각합니까?
const user = {
name: 'Heisenberg',
occupation: 'entrepreneur',
sayMyName() {
console.log(this.name);
}
};
const sayMyName = user.sayMyName;
sayMyName();
만약 네가 하이센버그를 맞혔다면, 너는 틀렸다.실제로는 빈 문자열을 얻을 수 있습니다.그런데 왜요?만약 네가 즉시 전화user.sayMyName()
하면 무슨 일이 일어날지그것은 하이센버그에서 취소될 것이다.잠깐만... 뭐???😨 내가 너희들을 헷갈리게 하기 전에 우리 먼저 후자부터 시작하자.우리는 키워드가 그것에 속하는 대상을 가리킨다고 말했다.
user.sayMyName()
를 호출하면 user
대상을 가리키기 때문에 this.name
를 호출하면 하이젠버그로 돌아갈 것입니다.그렇다면
user.sayMyName
새로운 변수를 부여하면 우리가 위의 예에서 한 것처럼 무슨 일이 일어날까요?간단하게 말하면 user.sayMyName
은 하나의 일반 함수가 되어 user
대상과 전혀 무관하다.위의 예시를 함수 자체를 취소하기 위해 호출
sayMyName()
write console.log(user.sayMyName)
대신 DevTools에 복사해 보십시오.user
객체에 정의된 정확한 함수를 얻을 수 있습니다.그러나 이번에는 함수의 부모 대상이 창이 됩니다.별의 배열을 통해 창에
name
속성이 있는 것은 사실이지만, 기본적으로 그 값은 ""- 빈 문자열입니다.만약 우리가 this.name
를 this.userName
로 바꾸면, 당신은 undefined
을 얻을 수 있습니다. 기본적으로 window.userName
이 없기 때문입니다.우리는 어떻게 이 문제를 해결합니까?
그래서 우리는 우리가 예상한 출력을 얻지 못했다는 것을 안다. 왜냐하면 우리는 잘못된 대상을 인용했기 때문이다.좋아, 그건 멋있어. 그런데 우리 어떻게 해결할까?네, 상하문만 귀속시키면
bind
방법으로 귀속할 수 있습니다.9 행을 다음과 같이 변경합니다.const sayMyName = user.sayMyName.bind(user);
Bind는 this
키워드를 제공하는 값의 상하문으로 설정하는 매개 변수가 필요합니다.이러한 상황에서 우리는'user'를 전달하기 위해 상하문을 user
대상에 귀속시키기를 희망합니다.리셋에서 이 함수를 사용하려면 어떻게 해야 합니까이전과 같이 컨텍스트를 바인딩하고 추출한 함수를 콜백으로 전달하기만 하면 됩니다.
document.getElementById('say-my-name').addEventListener('click', sayMyName);
두 번째 예
우리 두 가지 예를 다시 봅시다.지금까지 사람들은 그것이 예상치로 돌아올지 의심하기 시작했다.어떤 상황에서도 면접에 앉아서 갑자기 원하는 질문을 받았을 때 면접관은 사악한 미소를 지으며 화이트보드에 코딩 연습을 썼다-
“What do you think the output will be for the following?”
const shape = {
radius: 10,
diameter() {
return this.radius * 2;
},
perimeter: () => 2 * Math.PI * this.radius
};
shape.diameter();
shape.perimeter();
물론, 그들은 네가 머릿속에서 이 모든 것을 계산하기를 기대할 수 없다. 그렇지?틀림없이 함정이 있을 거야.있다!우리 그것을 분해합시다.
우선, 당신이 호출
shape.diameter
하면 모든 것이 좋은 것 같습니다. 우리는 대상의 반경*2로 돌아갑니다.여기는 화려한 것이 없으니, 너는 스무 살에 돌아올 것이다.다음으로 전화shape.perimeter
를 하고 돌아오세요NaN
🤦♂️.이 두 가지 방법을 비교하면 반드시 그들의 쓰기 방식과 관계가 있다.네가 옳다.두 번째는 화살표 함수입니다.화살표 함수는 자신의 상하문을 귀속시키지 않고 대상의 폐쇄 범위, 즉 창을 정의합니다.
window.radius
평가undefined
.따라서 상술한 함수의 계산 결과는 2 * 3.14 * undefined
, 반대로 우리는 NaN
를 얻었다.arrow 함수의 한 줄 프로그램에 대해서는
return
키워드를 생략할 수 있습니다.위의 예는 다음과 같습니다.perimeter: () => {
return 2 * Math.PI * this.radius;
};
세 번째 예
마지막 예를 봅시다. 이번에 첫 번째 예로 돌아가면 약간의 곡절이 있습니다. 왜냐하면 왜 그렇지 않기 때문입니다.
만약에 버그를 조사하고 있고 근본적인 원인이 코드와 관련이 있다고 의심한다면 방법이 있는 대상이 있습니다.어떤 원인 때문에 상술한 방법 중에는 폐쇄된 내부 함수가 하나 더 있다.
const user = {
name: 'Heisenberg',
occupation: 'entrepreneur',
sayMyName() {
const closure = function() {
console.log(this.name);
};
return closure();
}
};
const sayMyName = user.sayMyName;
sayMyName();
너는 이것이 당연한 모습이 아니라는 것을 곧 깨닫게 될 것이다.너는 그것을 일하게 하고 싶다. 너는 this
너의 대상을 가리키고 싶지만, 마찬가지로 아무 일도 없다. 너는 빈 문자열을 얻는다.보아하니 그것은 또 창문을 가리키는 것 같다.설마 우리가
delete window
우리의 모든 문제를 해결할 수 없단 말인가?지난번처럼 너에게 좋은 생각이 하나 있다!💡
user
대상을 지정한 함수에 연결합니다!const sayMyName = user.sayMyName.bind(user);
하지만 너는 여전히 얻는다""
.불행히도 이것은 등식의 절반에 불과하다.원인을 이해하기 위해서 우리는 그것을 분리해야 한다.만약 우리가 다시 로그아웃sayMyName
하면 함수체를 얻을 수 있으며, 그것은 9줄에서 내부 함수로 되돌아온다.만약 당신이 console.log(closure)
을 8줄에 삽입한다면, 당신은 우리가 가방을 닫는 주체를 얻게 될 것이다. 그 안에 console.log
가 있다.우리는 우리가 얻은 것이 빈 문자열이라는 것을 알고 있다. 왜냐하면
this
창의 대상을 가리키기 때문에, 우리는 반드시 정확한 상하문을 closure
에 귀속해야 한다. 그렇지?이것은 정확합니다. 따라서 계속해서 closure.bind(this)
로 돌아가지만, 이번에는 함수체로 돌아갑니다.🤔.이것은
bind
귀속만 진행되지만 실제로 우리가 필요로 하는 함수를 호출하지 않았기 때문이다.그래서 그중의 하나만 하면 된다고 하셨어요.return closure.bind(this)();
또는user.sayMyName()();
이미 짐작한 바와 같이, 이것은 융통성 있는 방법이며, 보기에는 매우 거칠어 보이지만, 결코 진정으로 적합한 해결 방안이 아니다.우리는 주어진 상하문을 가진 특정 함수를 호출할 수 있는 또 다른 방법이 있다.이것은 call
방법이다.반환 값을
return closure.call(this)
로 변경하면 매개 변수로 전달되는 주어진 컨텍스트 호출 함수를 JavaScript에 사용할 수 있습니다.마지막 솔루션은 다음과 같습니다.const user = {
name: 'Heisenberg',
occupation: 'entrepreneur',
sayMyName() {
const closure = function() {
console.log(this.name);
};
return closure.call(this)
}
};
const sayMyName = user.sayMyName.bind(user);
sayMyName();
먼저 user
대상을 13줄의 함수 부여값에 귀속시키고 sayMyName
내부에서 패키지 함수에 대한 호출을 사용하여 적당한 상하문으로 호출해야 한다.보시다시피
this
어떤 규칙에 따라 일을 하면 이 규칙들을 이해하기 시작하면 다른 모든 것이 더욱 의미가 있을 것입니다. 그러기를 바랍니다.명심해야 할 일
this
는 글로벌 객체를 가리키며 브라우저에 있는 경우 window
입니다.this
는 해당 객체가 속한 객체입니다.this
화살표 함수에서 사용할 때 부모 대상을 가리킨다.bind
또는 call
과 함께 사용하면 this
이러한 방법의 첫 번째 매개 변수로 전달되는 상하문을 인용합니다.bind
컨텍스트만 귀속되고 call
함수도 호출됩니다.Reference
이 문제에 관하여(도대체 이게 뭐야?JavaScript의 this 키워드 보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/flowforfrank/what-is-this-after-all-a-look-at-javascript-s-this-keyword-12ab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)