JavaScript의 this 지향 문제 자세히 보기
4378 단어 JavaScriptthis가리키다
글을 쓰다
JS의 this 지향은 초보자들을 골치 아프게 하는 문제였다.오늘, 우리는this가 쓰러진 것이 어떻게 된 일인지 함께 살펴보고,this지향원칙을 상세히 말하며, 이제부터this지향을 위해 더 이상 걱정하지 않는다.
개편
우선 우리는this가 Javascript 언어의 키워드라는 것을 알고 있다.
이것은 함수가 실행될 때, 자동으로 생성된 내부 대상을 대표하며, 함수 내부에서만 사용할 수 있다.함수 사용 장소에 따라this의 값이 변화합니다.그러나 전체적인 원칙이 하나 있다. 바로this의 지향은 함수가 정의될 때 확정할 수 없다. 함수가 실행될 때만this가 누구를 가리키는지 확정할 수 있다. 실제this의 최종 지향은 그 함수를 호출하는 대상이다.그럼 우리 한 걸음 한 걸음 이 문제를 탐색해 봅시다.
탐색 1
function a() {
var user = " ";
console.log(this.name); //undefined
console.log(this); //Window
}
a();
window.a();//
위에서 말한 바와 같이this의 최종 지향은 그것이 있는 함수를 호출하는 대상입니다. 여기 a는 사실 윈도우즈 대상에서 나온 것입니다.탐색2
var obj = {
name: ' ',
f1: function () {
console.log(this.name);//
}
};
obj.f1();
다시 한 번 강조하자면this의 지향은 함수가 정의될 때 확정할 수 없고 함수가 실행될 때만this가 누구를 가리키는지 확정할 수 있다.이 예는this가 있는 f1 함수는obj 대상에서 호출되기 때문에 여기의this는obj 대상을 가리킨다.탐색 3
만약에this를 철저히 이해하려면 다음 몇 가지 예를 봐야 돼요.
var obj = {
a: 5,
b: {
a: 10,
fn: function () {
console.log(this.a); //10
}
}
};
obj.b.fn();
this의 최종 지향은 그 함수를 호출하는 대상이라고 하지 않았습니까?여기는 왜 obj 대상을 가리키지 않습니까?여기에 세 가지를 보충해야 한다.
다음에this의 몇 가지 다른 사용 상황을 소개해 드리겠습니다.
구조 함수 (new 키워드) 상황
function Student() {
this.name = ' ';
}
var s1 = new Student();
console.log(s1.name);//
여기서 대상 s1이 함수 Student에 있는name을 눌렀을 수 있는 이유는 new 키워드가this의 지향을 바꿀 수 있기 때문입니다. 이this를 대상 s1을 가리킵니다.
// new
1. .
2. this .
3. this .
4. .
타이머의this가 상황을 가리키다
var num = 0;
function Obj() {
this.num = 1;
this.getNum1 = function () {
console.log(this.num);
};
this.getNum2 = function () {
setInterval(function () {
console.log(this.num);
}, 1000);
};
}
var o = new Obj();
o.getNum1();//1 (o.num)
o.getNum2();//0 (window.num)
o.getNum2()
값이 0인 이유는 바로 여기this
지향window
이다. 우리의this지향원칙을 꺼내서 설명한다. this
지향은 함수가 정의될 때 확정할 수 없고 함수가 실행될 때만 확정할 수 있다. this
도대체 누구를 가리키는지, 실제this
의 최종 지향은 그 함수를 호출하는 대상이다.해:
this.num
이 있는 함수는 타이머setInterval
내의 function () { console.log(this.num);}
로,this지향원칙에 따라 이 함수가 실행되면,this지향은 그의 상급 대상을 가리킨다.setInterval
, 또setInterval
는window
점을 찍었기 때문에this
가리킨다window
.call
, apply
, bind
방향 변경
var num = 0;
function Obj() {
this.num = 1;
this.getNum1 = function () {
console.log(this.num);
};
this.getNum2 = function () {
setInterval(function () {
console.log(this.num);
}.bind(this), 1000);// bind this
};
}
var o = new Obj();
o.getNum1();//1 (o.num)
o.getNum2();//1 (o.num)
설명:bind() 메서드는 Function입니다.prototype의 한 방법입니다. 귀속 함수가 호출될 때bind 방법은 새로운 함수를 만들고 첫 번째 인자를 새로운 함수로 실행할 때this를 만듭니다.
원칙에 따라:
bind
방법을 사용하지 않았기 전: 호출되었을 때: this.num
호출된 함수의 대상, 즉 window.setTimeout
대상을 가리킨다.bind
방법을 사용한 후: 호출되었을 때: 원래this
를 → 호출getSum2
함수(바로 새로운this
가 있는 함수)의 대상으로 다시 가리킨다.여기 구조 함수는 new
를 통해 호출되기 때문에 o 대상을 가리킨다.bind
방법은 이 상황에서 비교적 자주 사용되는데 물론 call
또는apply
방법으로 대체해도 되고 얻은 결과도 정확하지만 call
과apply
방법은 호출 후 바로 실행되기 때문에 시간 지연 효과가 없고 타이머도 의미가 없다.이상은 자바스크립트의 this지향 문제에 대한 상세한 내용입니다. 자바스크립트this지향에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.