그렇지!이것 괜찮아요?
this
키워드는 가장 혼란스러운 자바스크립트 개념 중 하나여야 한다. 왜냐하면 호출 방식이 동적이기 때문이다.만약 당신이 이 글을 읽고 있다는 것을 발견한다면, 당신은 이미 this
몇 번을 읽었을 것이다. 더 잘 이해하고 싶을 것이다.나는 this
실제 예와 최소한의 용어로 명확하게 표현할 수 있기를 바란다.당신이 가장 좋아하는 브라우저에서 컨트롤러를 열고 계속 조작하십시오.this
전 세계가장 직접적인 식별 방법
this
은 이를 전역 대상으로 사용하는 것이다.전역 객체는 JavaScript 코드의 모든 위치에서 액세스할 수 있는 객체입니다.브라우저는 전역 대상window
, NodeJ는 전역 대상global
이라고 부른다.이런 기본적인 기본 귀속을 기본 귀속이라고 부른다.console.log(this) // window
console.log(window) // window
console.log(this === window) // true
fetch
와localStorage
가 전역 창 대상의 일부라는 것을 아십니까?var
키워드와 함수로 성명된 변수를 창 대상의 속성으로 합니다.글로벌 객체의 속성은 점이나 괄호 기호를 사용하지 않고 액세스할 수 있습니다.그러나 let
또는 const
키워드 선언을 사용하는 변수는 글로벌 객체의 일부가 되지 않고 액세스할 수 없는 환경에 저장됩니다.var age = 29
console.log(age) // 29
console.log(this.age) // 29
console.log(window.age) // 29
function sayHi() {
console.log("Hi")
}
sayHi() // Hi
this.sayHi() // Hi
window.sayHi() // Hi
const sayHello = function() {
console.log("Hello")
}
sayHello() // Hello
this.sayHello() // Uncaught TypeError: this.sayHello is not a function
window.sayHello() // Uncaught TypeError: window.sayHello is not a function
this
함수에서this
정규 함수에서도 전체 대상을 가리킨다.또는, 우리도 이 함수들의 상하문이 전체적인 대상이라고 말할 수 있다.Context는 자바스크립트 엔진이 코드를 실행할 때this
가 주어진 시간에 대한 값('실행 상하문'이라고도 부른다)을 가리킨다.var whatIsThis = function() {
console.log(this)
}
whatIsThis() // window
경고:use strict 모드를 사용할 때 this
대상에 대한 기본 연결을 허용하지 않습니다.따라서 window
의 값이 정의되지 않을 수 있습니다."use strict"
var whatIsThis = function() {
console.log(this)
}
whatIsThis() // undefined
this
방법방법은 그것이 대상 내부의 함수라는 것을 의미한다.
this
메소드 내부의 키워드는 상위 객체로 설정됩니다.이것은 은식 귀속이라고 하는데 this
그것이 속한 대상에 간접적으로 귀속되기 때문이다.var obj = {
getThis: function() {
return this
},
}
// equivalent ES6 method
var obj = {
getThis() {
return this
},
}
console.log(obj.getThis()) // obj
console.log(obj === obj.getThis()) // true
접근 방법의 대상의 속성은 현식으로 사용해야 한다this
.그렇지 않으면, 같은 함수 범위 내에서 같은 이름의 변수를 찾을 것이다.var me = {
name: "Phillip",
getName() {
const name = "Sunnie"
console.log("My name is " + this.name)
console.log("My name is " + name)
},
}
me.getName() // My name is Phillip
// My name is Sunnie
this
예상 문자열을 보여 줍니다.만약 우리가 getName 방법의 정의를 이 방법 이외의 변수에 분배한다면 어떻게 될까요?새 getName 함수가 'me' 대상에 연결되지 않기 때문에 me.getName()
은밀한 연결을 잃어버릴 것입니다.반대로 새 getName은 this
키워드로 설명되어 있기 때문에 전역 창 대상에 연결되고 전역 대상의 속성 검색 var
을 시도합니다.다음은 MDN 공식 문서에 대한 견해입니다.In most cases, the value of this is determined by how a function is called. It can't be set by assignment during execution, and it may be different each time the function is called.
var me = {
name: "Phillip",
getName: function() {
console.log("My name is " + this.name)
},
}
var getName = me.getName
me.getName() // My name is Phillip
getName() // My name is undefined
'내 이름은 정의되지 않은 것이다'가 아니라'내 이름은'을 볼 수 있다.이것은 우리가 이전에 전역적으로 사용했기 때문에 this.name
키는 거기에 있지만, 값은 빈 문자열로 설정되어 있습니다."me"대상에서 getName 방법을 추출하여 독립된 함수로 만드는 것이 어떻습니까?그리고 'me' 대상에 같은 이름의 getName 속성을 만들고 독립된 getName 함수를 인용으로 지정합니다.우리 각각 그들에게 전화를 걸어 봅시다.독립된 함수를 단독으로 호출하면,
this.name
전역 대상을 인용하고 this
대상에서 이름을 검색합니다.함수를 'me' 대상의 속성으로 호출하면 window
상하문은 'me' 대상이 됩니다.function getName() {
console.log("My name is " + this.name)
}
var me = {
name: "Phillip",
getName: getName,
}
getName() // My name is undefined
me.getName() // My name is Phillip
경험의 법칙: 방법의 왼쪽을 보면 this
라고 불리며 이 대상에 속한다.없으면 this
글로벌 객체에 속합니다.this
call,apply,bind를 사용합니다."getName"함수를 다시 사용할 수 있도록 하려고 합니다.콜, apply,bind 함수를 사용하여 코드를 개선합시다.이것들은 함수 정의에 추가되어 그것들을 직접 호출하는 특수 함수들이다.
this
와 call
는 대상을 첫 번째 매개 변수로 하기 때문에 방법은 어떻게 처리하는지 이해할 것이다apply
.전달된 매개 변수가 없는 경우 컨텍스트는 글로벌 객체가 됩니다.function getName() {
console.log("My name is " + this.name)
}
var me = {
name: "Phillip",
}
var you = {
name: "Sunnie"
}
getName.call(me) // My name is Phillip
getName.apply(you) // My name is Sunnie
getName.call() // My name is undefined
this
와 call
사이의 차이는 첫 번째 매개 변수 다음에 여러 개의 매개 변수를 방법에 전달하는 데 있다.apply
는 쉼표로 값을 구분하고 call
도 쉼표로 값을 구분하지만 그룹 내에 있습니다.function getInfo(age, hobby) {
console.log(`My name is ${this.name}, I am ${age} and my hobby is ${hobby}`)
}
var me = {
name: "Phillip",
}
var you = {
name: "Sunnie"
}
getInfo.call(me, 29, "coding") // My name is Phillip, I am 29 and my hobby is coding
getInfo.apply(you, [28, "floral design"]) // My name is Sunnie, I am 28 and my hobby is floral design
유용한 팁: 쉼표는 쉼표를 받고, 수락 배열을 적용합니다.일반적으로, 우리는 단지 어떤 방법을 어떤 대상과 연관시키려고 한다.
apply
특정 방법을 특정 대상에 연결하여 bind
의 값을 예측할 수 있도록 도와주고 그 정의를 조사하는 것이 아니라 그 호출 방식을 조사하는 것을 통해 발견할 수 있습니다.콜과 apply와 달리bind는 추가 함수를 즉시 호출하지 않습니다.이것은 현식 귀속이라고 한다function getName() {
console.log("My name is " + this.name)
}
var me = {
name: "Phillip",
}
getName = getName.bind(me)
getName() // My name is Phillip
bind를 사용한 후에 이 방법에 다시 분배하는 것을 잊지 마세요!bind의 실제 용도는 함수를 리셋으로 전달하는 것이다.bind를 사용하지 않는 예를 보여 줍니다.
var me = {
name: "Phillip",
getName: function() {
console.log("My name is " + this.name)
},
}
function calleMeMaybe(callback) {
callback()
}
calleMeMaybe(me.getName) // My name is undefined
getName은 엔진 뚜껑 아래에서 일어나는 일이기 때문에 정의되지 않았습니다.callback = me.getName
이제 getName을 "me"대상에 연결합니다.var me = {
name: "Phillip",
getName: function() {
console.log("My name is " + this.name)
},
}
me.getName = me.getName.bind(me)
function calleMeMaybe(callback) {
callback()
}
calleMeMaybe(me.getName) // My name Phillip
this
함수 내구조 함수JavaScript에서 함수는 구조 함수로 사용할 수 있으며'new'키워드를 사용하여 새 객체를 구성할 수 있습니다.
this
는 함수 구조 함수로 만들어진 실례(또는 대상)로 설정합니다.function Song(author) {
this.author = author
this.song = "Let it go"
this.getInfo = function() {
console.log(`${this.author} sang ${this.song}`)
}
}
var song = new Song("Idina Menzel")
song.getInfo() // Idina Menzel sang Let it go
var song1 = new Song("Demi Lovato")
song1.getInfo() // Demi Lovato sang Let it go
// change of context
var getInfo = song1.getInfo
getInfo() // undefined is sung by undefined
this
학급대행클래스는 현대 함수 구조 함수다.클래스 내부에서
this
의 행위는 함수 구조 함수와 같고 클래스가 만든 특정한 대상을 인용한다.'엄격 모드' 는 기본적으로 클래스에 적용됩니다.class Song {
constructor(author) {
this.author = author
this.song = "Let it go"
}
getInfo() {
console.log(`${this.song} is sung by ${this.author}`)
}
}
const song = new Song("Idina Menzel")
song.getInfo() // Idina Menzel sang Let it go
const song1 = new Song("Demi Lovato")
song1.getInfo() // Demi Lovato sang Let it go
// change of context
const getInfo = song1.getInfo
getInfo() // Uncaught TypeError: Cannot read property 'song' of undefined
React에 익숙하다면, 이벤트 처리 프로그램을 클래스 자체에 현저하게 연결하는 것을 알 수 있습니다.이것은 일부 이벤트 탐지기(예를 들어 onClick, onSubmit 등)가 이벤트 처리 프로그램 방법을 리셋으로 전달하기 때문이다.리셋 함수는 상하문을 잃게 된다는 것을 명심해라.class Form extends React.Component {
constructor(props) {
super(props)
this.handleClick = this.handleClick.bind(this) // necessary
}
handleSubmit(event) {
// Handle logic
}
render() {
return <button onClick={this.handleSubmit}>Submit</button>
}
}
this
화살표 기능JavaScript가 이상해지고 예기치 않은 행동을 할 수 있습니다.당신은
this
의 값이 방법 내부의 함수 중 얼마라고 생각합니까?우리의 직감은 그 방법이 속한 아버지의 대상을 여전히 인용할 것이라고 말한다.그러나 this
는 사실상 this
대상을 가리키는 것이 아니다.우리는 앞의 예시를 예로 삼아 그것을 수정합시다.var me = {
name: "Phillip",
getName: function () {
function innerFunction() {
console.log("My name is " + this.name)
}
innerFunction();
},
}
me.getName() // My name is undefined
이 문제를 해결할 수 있는 여러 가지 방법이 있다.window
를 변수에 저장하고 내부 함수에서 이 변수를 인용할 수 있다.관례에 따르면 이 변수를'self'라고 부른다.this
를 사용하여 내부 함수를 방법의 상하문에 연결할 수 있다.In arrow functions,
this
retains the value of the enclosing lexical context'sthis
. - MDN
이것은
bind
의 값이 화살표 함수를 포함하는 함수로 설정되었다는 것을 의미한다.// 1
var me = {
name: "Phillip",
getName: function () {
var self = this;
function innerFunction() {
console.log("My name is " + self.name)
}
innerFunction();
},
}
me.getName()
// 2
var me = {
name: "Phillip",
getName: function () {
function innerFunction() {
console.log("My name is " + this.name)
}
innerFunction = innerFunction.bind(this);
innerFunction();
},
}
me.getName()
//3
var me = {
name: "Phillip",
getName: function () {
const innerFunction = () => {
console.log("My name is " + this.name)
}
innerFunction();
},
}
me.getName()
HTML 포함
this
이벤트가 트리거되면 JavaScript 이벤트 탐지기가 액세스할 수 있습니다this
.this
그런 다음 HTML 요소를 참조합니다.이벤트 탐지기 리셋 함수가 화살표 함수로 성명되면 this
창 대상과 폐쇄된 상하문을 인용합니다.<h1 class="h1">Hello World</h1>
<h2 class="h2">Hi World</h2>
const h1 = document.querySelector(".h1")
const h2 = document.querySelector(".h2")
h1.addEventListener("click", function(e) {
console.log(e.target) // <h1 class="h1">Hello World</h1>
console.log(this) // <h1 class="h1">Hello World</h1>
})
h2.addEventListener("click", e => {
console.log(e.target) // <h2 class="h2">Hi World</h2>
console.log(this) // window
})
요약
내 글을 읽어줘서 고마워!👏👏 나는 진심으로 이것이 유용한 내용으로 네가
this
키워드에 대한 곤혹을 풀 수 있기를 바란다.나는 나의 그 장편 문장의 요점을 가지고 떠날 것이다.다시 한 번 감사합니다!this
는 일반적으로 기본적인 전역 대상을 가리키며 일반 함수에서는 기본적으로 귀속된다.this
는 정의되지 않았다.this
는 이 방법을 가진 대상이지만 호출this
의 방식에 달려 있다.값을 확인하려면 this
의 왼쪽을 확인합니다.this
를 붙여 넣습니다.this
의 값을 확정한다.Reference
이 문제에 관하여(그렇지!이것 괜찮아요?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shimphillip/this-is-it-you-got-this-6a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)