Javascript에서 "This"의 고급 사용법을 드디어 알게 되었습니다.
25709 단어 webdevjavascripttutorial
함수가 화살표 함수로 정의된 경우: {:#arrow functions}
const arrowFunction = () => {
console.log(this);
};
이 경우 this
의 값은 항상 상위 범위의 this
와 같습니다.const outerThis = this;
const arrowFunction = () => {
// Always logs `true`:
console.log(this === outerThis);
};
화살표 함수는 매우 좋습니다. this
의 내부 값은 변경할 수 없기 때문에, 항상 같습니다.외부로
this
.기타 예
화살표 기능을 사용하여
this
값bind
을 변경할 수 없습니다.// Logs `true` - bound `this` value is ignored:
arrowFunction.bind({foo: 'bar'})();
화살표 기능을 사용하여 this
or call
값apply
을 변경할 수 없습니다.// Logs `true` - called `this` value is ignored:
arrowFunction.call({foo: 'bar'});
// Logs `true` - applied `this` value is ignored:
arrowFunction.apply({foo: 'bar'});
arrow 함수에 대해서는 함수의 구성원으로 함수를 호출하여 this
의 값을 변경할 수 없습니다다른 대상:
const obj = {arrowFunction};
// Logs `true` - parent object is ignored:
obj.arrowFunction();
arrow 함수에 대해 함수를 함수로 호출하여 this
의 값을 변경할 수 없습니다건설사:
// TypeError: arrowFunction is not a constructor
new arrowFunction();
바인딩 인스턴스 방법
실례 방법에 대해
this
시종일관 클래스 실례를 인용하는 것을 확보하려면화살표 함수 및 class
fields를 사용하는 방법:
class Whatever {
someMethod = () => {
// Always the instance of Whatever:
console.log(this);
};
}
인스턴스 방법을 어셈블리로 사용하는 경우(예:React 구성 요소 또는 웹 구성 요소).
이 내용은'아버지 범위'
this
와 this
의 경계를 깨뜨렸다고 느끼게 할 수 있다.규칙, 그러나 만약 당신이 클래스 필드가 물건을 설정하는 문법 설탕이라고 생각한다면, 그것은 의미가 생기기 시작할 것이다
구조 함수에서 다음을 수행합니다.
class Whatever {
someMethod = (() => {
const outerThis = this;
return () => {
// Always logs `true`:
console.log(this === outerThis);
};
})();
}
// …is roughly equivalent to:
class Whatever {
constructor() {
const outerThis = this;
this.someMethod = () => {
// Always logs `true`:
console.log(this === outerThis);
};
}
}
대체 모드는 귀속 구조 함수 중의 기존 함수나 분배를 포함한다구조 함수 중의 함수.클래스 필드를 사용할 수 없는 경우
건설업자는 합리적인 선택이다.
class Whatever {
constructor() {
this.someMethod = () => {
// …
};
}
}
그렇지 않으면 new 호출 함수/클래스를 사용합니다: {:#new}
new Whatever();
상기 함수는 호출Whatever
(클래스라면 구조 함수를 호출)하고 this
를결과
Object.create(Whatever.prototype)
.class MyClass {
constructor() {
console.log(
this.constructor === Object.create(MyClass.prototype).constructor,
);
}
}
// Logs `true`:
new MyClass();
구식 구조 함수도 마찬가지다.function MyClass() {
console.log(
this.constructor === Object.create(MyClass.prototype).constructor,
);
}
// Logs `true`:
new MyClass();
기타 예
new
로 호출할 때 this
의 값은 bind
로 변경할 수 없습니다.const BoundMyClass = MyClass.bind({foo: 'bar'});
// Logs `true` - bound `this` value is ignored:
new BoundMyClass();
new
호출을 사용할 때 구성원 신분으로 함수를 호출해서 this
의 값을 변경할 수 없습니다다른 물체:
const obj = {MyClass};
// Logs `true` - parent object is ignored:
new obj.MyClass();
그렇지 않으면 함수에 "바인딩" 값이 있는 경우: {:#bound}
function someFunction() {
return this;
}
const boundObject = {hello: 'world'};
const boundFunction = someFunction.bind(boundObject);
언제 호출boundFunction
하든지 그 this
값은 bind
에게 전달되는 대상이 될 것이다(
boundObject
).// Logs `false`:
console.log(someFunction() === boundObject);
// Logs `true`:
console.log(boundFunction() === boundObject);
bind
를 사용하여 함수를 외부에 귀속시키는 것을 피한다this
.반대로 사용arrow functions은 함수 성명에서 명확했기 때문이다this
.코드 뒤에서 일어난 일.
bind
를 사용하여 this
를 부모 대상과 무관한 값으로 설정하지 마십시오.이것은 보통 뜻밖이다. 이것이 바로 왜 this
이렇게 나쁜 평판을 얻었는가 하는 것이다.값을 매개 변수로 전달하는 것을 고려하기;이것은 화살표 함수와 함께 사용할 수 있는 더욱 현시적이다.기타 예
바인딩 함수를 호출할 때
this
의 값은 call
orapply
로 변경할 수 없습니다.// Logs `true` - called `this` value is ignored:
console.log(boundFunction.call({foo: 'bar'}) === boundObject);
// Logs `true` - applied `this` value is ignored:
console.log(boundFunction.apply({foo: 'bar'}) === boundObject);
귀속 함수를 호출할 때 함수를다른 객체의 멤버:
const obj = {boundFunction};
// Logs `true` - parent object is ignored:
console.log(obj.boundFunction() === boundObject);
그렇지 않으면 호출 시 다음을 설정합니다. {:#call apply}
function someFunction() {
return this;
}
const someObject = {hello: 'world'};
// Logs `true`:
console.log(someFunction.call(someObject) === someObject);
// Logs `true`:
console.log(someFunction.apply(someObject) === someObject);
this
의 값은 this
/call
에 전달되는 대상이다.apply
/call
를 사용하여 apply
를 부모 대상과 무관한 값으로 설정하지 마십시오.이것은 보통 뜻밖이다. 이것이 바로 왜 this
이렇게 나쁜 평판을 얻었는가 하는 것이다.값을 매개 변수로 전달하는 것을 고려하기;이것은 화살표 함수와 함께 사용할 수 있는 더욱 현시적이다.불행하게도
this
DOM 이벤트 감청기 등에 의해 다른 값으로 설정되어 사용 가능코드를 이해하기 어렵습니다.
element.addEventListener('click', function (event) {
// Logs `element`, since the DOM spec sets `this` to
// the element the handler is attached to.
console.log(this);
});
위의 경우this
는 피하고 다음을 수행합니다.element.addEventListener('click', (event) => {
// Ideally, grab it from a parent scope:
console.log(element);
// But if you can't do that, get it from the event object:
console.log(event.currentTarget);
});
그렇지 않으면, 함수가 부모 대상을 통해 호출된 경우 (이것은): {:#object member}
const obj = {
someMethod() {
return this;
},
};
// Logs `true`:
console.log(obj.someMethod() === obj);
이 경우 함수는 parent.func()
의 구성원으로 호출되기 때문에 obj
는 this
로 호출된다.이런 상황이 발생하다호출 시간, 따라서 부모 대상이 없는 상황에서 함수를 호출하거나 사용
다른 상위 객체:
const {someMethod} = obj;
// Logs `false`:
console.log(someMethod() === obj);
const anotherObj = {someMethod};
// Logs `false`:
console.log(anotherObj.someMethod() === obj);
// Logs `true`:
console.log(anotherObj.someMethod() === anotherObj);
obj
는 가짜다. someMethod() === obj
는 someMethod
의 멤버가 아니기 때문이다.그렇게 지도 모른다, 아마, 아마...이런 일을 시도할 때 이 문제에 부딪혔다.
const $ = document.querySelector;
// TypeError: Illegal invocation
const el = $('.some-element');
이는 obj
의 실현이 자신의 querySelector
값에 착안하고 기대했기 때문이다DOM 노드일 수 있으며 위의 작업을 수행하면 연결이 끊어집니다.위 목표를 올바르게 달성하려면:
const $ = document.querySelector.bind(document);
// Or:
const $ = (...args) => document.querySelector(...args);
흥미로운 사실: 모든 API가 내부에서 사용되는 것은 아니다this
.콘솔 방법this
이console.log
인용을 피하기 때문에 this
귀속log
이 필요하지 않습니다.console
를 부모 대상과 무관한 값으로 설정하기 위해 함수를 대상에 이식하지 마십시오.이것은 보통 뜻밖이다. 이것이 바로 왜 this
이렇게 나쁜 평판을 얻었는가 하는 것이다.값을 매개 변수로 전달하는 것을 고려하기;이것은 화살표 함수와 함께 사용할 수 있는 더욱 현시적이다.그렇지 않으면 함수 또는 부모 필드가 엄격한 모드인 경우: {:#strict}
function someFunction() {
'use strict';
return this;
}
// Logs `true`:
console.log(someFunction() === undefined);
이 경우 this
의 값이 정의되지 않습니다.부모 역할 영역이 strictmode에 있고 모든 모듈이 엄격한 모드에 있으면 함수에 필요 없음
this
.이것에 의존하지 마라.내 말은, 더 간단한 방법으로
'use strict'
값을 얻을 수 있다는 것이다.😀.그렇지 않은 경우: {:# 그렇지 않은 경우
function someFunction() {
return this;
}
// Logs `true`:
console.log(someFunction() === globalThis);
이 경우 undefined
의 값은 this
의 값과 같다.대다수 (나 포함) 는
globalThis
전체를 대상으로 하지만, 기술적으로는 100% 정확하지 않다.다음은 [mathias Bynens]의 상세한 정보(https://mathiasbynens.be/notes/globalthis#terminology)로 왜 그것이 단순한 globalThis
가 아니라 globalThis
라고 불리는지 포함한다.global
전역 대상을 인용하는 것을 피하십시오. (네, 저는 여전히 그것을 이렇게 부릅니다.)대신 this
이것은 훨씬 명확해야 한다.
Javascript의 추가 리소스를 배우려면 다음과 같이 하십시오.
책 수령: Javascript Challenges
JavaScript: Understanding the Weird Parts
Monster JavaScript Course - 50+ projects and applications
참조 장소: https://web.dev/javascript-this/
Reference
이 문제에 관하여(Javascript에서 "This"의 고급 사용법을 드디어 알게 되었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bricourse/finally-understanding-the-advanced-uses-of-this-in-javascript-40g8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)