Javascript 의 this 상세 설명
7634 단어 Javascriptthis
역할 영역 은 두 가지 로 나 뉜 다.
this 바 인 딩 규칙
this 는 호출 할 때 바 인 딩 되 어 함수 의 호출 위치 에 달 려 있 습 니 다.이 를 통 해 알 수 있 듯 이 일반적인 상황 에서(엄격 하지 않 은 모드 에서)this 는 함수 호출(스 택 호출)의 문맥 에 따라 대상 을 연결 합 니 다.
1.기본 바 인 딩
기본 바 인 딩:기본 바 인 딩 은 엄격 하지 않 은 모드 에서 다른 바 인 딩 규칙 을 사용 하지 않 았 을 때 this 는 함수 호출(스 택 호출)의 문맥 에 따라 대상(전체 대상)을 바 인 딩 하 는 것 을 말 합 니 다.(엄격 한 모드 에서 undefined 바 인 딩)
밤 을 들다
function foo() {
console.log(this.a);
};
function bar() {
var a = 3;
foo();
}
var a = 2;
bar(); // ,this
실행 결과:2//"use strict"실행 결 과 를 더 하면 this is undefined 가 됩 니 다.
이 함수 호출 시 기본 바 인 딩 을 사 용 했 습 니 다.함수 호출(스 택 호출)의 컨 텍스트 는 전역 역할 영역 이기 때문에 this 는 전역 대상(global)을 바 인 딩 했 습 니 다.
eg2:
function foo() {
console.log(this.a)
};
var a = 2;
(function() {
"use strict"
foo();
})();
실행 결과:2여기 서 주의해 야 할 것 은 기본 바 인 딩 에 대해 this 바 인 딩 대상 이 호출 위치 가 엄격 한 모드 에 있 는 지 여 부 를 결정 하 는 것 이 아니 라 함수 체 가 엄격 한 모드 에 있 는 지 여부 입 니 다(함수 체 가 엄격 한 모드 에 있 으 면 this 바 인 딩 undefined;그렇지 않 으 면 this 바 인 딩 전역 대상).또한 엄격 한 모델 과 비 엄격 한 모델 은 연결 이 가능 하지만 혼용 하지 않 는 것 이 좋다.
간접 인용 은 일반적으로 기본 바 인 딩 규칙 을 적용 합 니 다.
function foo() {
console.log(this.a);
};
var a = 2;
var o = { a: 3, foo: foo };
var p = { a: 4 };
o.foo(); //3
(p.foo = o.foo)(); //2
할당 식 p.foo=o.foo 의 반환 값 은 대상 함수 foo 를 직접 참조 합 니 다.2.암시 적 귀속
암시 적 바 인 딩:문맥 대상 에서 호출 하여 문맥 대상 에 바 인 딩 합 니 다.
밤 을 들다
function foo() {
console.log(this.a);
};
var obj = {
a: 2,
foo: foo
};
obj.foo(); //2
foo(); //undefined
이 코드 에 서 는 foo()가 참조 속성 으로 obj 대상 에 추가 되 었 습 니 다.obj 가 이 참조 속성 함 수 를 호출 할 때 이 참조 속성 컨 텍스트 를 사용 합 니 다.this 는 obj 대상 에 연 결 됩 니 다.(이 함 수 는 엄 밀 히 말 하면 obj 대상 에 속 하지 않 고 인용 속성 으로 만 사용 합 니 다.스텔스 귀속 에 속 합 니 다.아래 foo()함수 의 직접 실행 은 obj 대상 참조 가 아니 므 로 문맥 대상 은 전체 대상 입 니 다.그래서 this 는 undefined 를 연결 하 였 습 니 다.기본 귀속 에 속 합 니 다.
대상 인용 체인 에서 윗 층 만 있 거나 마지막 층 이 호출 위치 에서 작용 한다.
주의:
1.스텔스 귀속 함 수 는 귀속 대상 을 잃 어 버 립 니 다.이 때 기본 바 인 딩 을 사용 합 니 다.this 를 전체 대상 이나 undefined 에 연결 합 니 다.엄격 한 모드 인지 여부 에 달 려 있 습 니 다.
eg:
function foo() {
console.log(this.a);
};
var obj = {
a: 2;
foo: foo
}
var bar = obj.foo;
var a = 'biubiubiu';
bar();
실행 결과:"biubiubiu"해석:bar 는 obj.foo 의 인용 인 것 같 습 니 다.실제로 bar 는 함수 foo 를 직접 참조 하여 단순 한 함수 호출 이 므 로 기본 바 인 딩 입 니 다.
2.매개 변수 전달 은 암시 적 할당 이 므 로 함수 에 들 어 갈 때 도 암시 적 할당 을 받는다.
eg:
function foo() {
console.log(this.a);
};
var obj = {
a: 2,
foo: foo
};
function bar(fn) {
fn();
};
var a = "biubiubiu";
bar(obj.foo);
실행 결과:"biubiubiu"해석:실제 매개 변수 도 암시 적 할당 이지 만 매개 변 수 는 함수 에 들 어가 함수 에서 실 행 됩 니 다.이때 도 함수 foo 를 직접 인용 하 였 기 때문에 단순 한 함수 호출 이 며 기본 바 인 딩 을 사용 하 였 습 니 다.
3.함 수 를 언어 내 장 된 함수 에 전달 합 니 다.(위의 상황 과 대체적으로 비슷 합 니 다.자신의 성명 함 수 를 언어 내 장 된 함수 로 바 꿉 니 다)리 셋 함수 가 this 를 잃 어 버 리 는 경우 가 흔 합 니 다.게다가 리 셋 함 수 를 호출 하 는 함수 도 this 를 수정 할 수 있 습 니 다.
3.명시 적 바 인 딩
명시 적 바 인 딩:지정 한 대상 에 this 를 직접 연결 합 니 다.Javascript 에서 절대 다수의 함수 와 자신 이 만 든 함 수 는 모두 이 두 가지 명시 적 바 인 딩 방법 을 사용 할 수 있 습 니 다.
1、.call()
2、.apply()
이 두 가지 바 인 딩 방법,첫 번 째 매개 변 수 는 this 바 인 딩 대상 입 니 다.(들 어 오 는 인자 가 원본 값(문자열 형식,불 형식,숫자 형식)이면 이 원본 값 은 대상 형식(new String,new Boolean,new Number)으로 전 환 됩 니 다.
밤 을 들다
function foo() {
console.log(this.a);
};
var obj = {
a: 2
};
foo.call(obj);
실행 결과:2거위,바 인 딩 이 바 인 딩 을 잃 어 버 린 문 제 를 해결 할 수 없다 는 것 을 보 여 줍 니 다.이때 새로운 친구 가 왔 습 니 다.
3.bid()(하 드 바 인 딩 은 흔히 볼 수 있 는 장면 이기 때문에 es5 는 이 내 장 된 방법 Function.prototype.bid 를 제공 합 니 다.)
bid()는 새로운 인 코딩 함 수 를 되 돌려 주 고 this 를 지정 한 매개 변수 에 연결 하고 함 수 를 호출 합 니 다.
밤 을 들다
function foo(e) {
console.log(this.a + e);
return this.a + e;
};
var obj = {
a: 2
}
var bar = foo.bind(obj); //
var b = bar(3); // 2 3
console.log(b); // 5
bid()는 또 하나의 기능 이 있 습 니 다.this 를 연결 하 는 첫 번 째 매개 변 수 를 제외 한 다른 매개 변 수 를 하층부 에 전달 하 는 함수(일부 응용 은'코 리 화'의 일종)입 니 다.여기 에는 null 또는 undefined 를 this 의 바 인 딩 대상 으로 call,apply,bid 에 전송 하 는 개념 이 있 습 니 다.이 값 들 은 호출 할 때 무시 되 고 실제 적 으로 기본 바 인 딩 규칙 을 사용 합 니 다.
응용 필드:
function foo(a,b) {
console.log("a:" + a + ",b:" + b);
};
// “ ”
foo.apply(null,[2,3]); //a:2,b:3
//bind()
var bar = foo.bind(null,2);
bar(3); //a:2,b:3
해석:this 바 인 딩 대상 으로 매개 변 수 를 입력 하고 전송 하지 않 으 면 자리 표시 자(null)를 사용 합 니 다.이 때 기본 바 인 딩 규칙 을 사용 합 니 다.위의 이 예 는 어느 정도 부작용 이 생 길 수 있 으 며,이런 장면 을 활용 해 야 한다 면 더욱 안전 하 다.빈 대상 을 만 들 수 있 습 니 다.
var ∅ = Object.create(null);
// :
foo.apply(∅,[2,3]); //a:2,b:3
var bar = foo.bind(∅,2);
bar(3); //a:2,b:3
메모:하 드 바 인 딩 후 암시 적 바 인 딩 과 명시 적 바 인 딩 을 사용 하여 this 를 수정 할 수 없습니다.소프트 바 인 딩 방법 softBind()를 소개 합 니 다.this 가 전체 대상 이나 undefined 에 연결 되 어 있 는 지 확인 한 후 this 를 지정 한 기본 대상 에 연결 합 니 다.바 인 딩 후 효 과 는 하 드 바 인 딩 과 같 지만 암시 적 바 인 딩 이나 명시 적 바 인 딩 을 유지 하여 this 를 수정 하 는 능력 을 유지 합 니 다.
4.new 귀속
자바 script 의 new 메커니즘 은 클래스 언어 와 완전히 다르다.자바 script 에서 구조 함 수 는 new 연산 자 를 사용 할 때 호출 되 는 함수 일 뿐 하나의 클래스 에 속 하지 않 고 하나의 클래스 를 예화 하지 않 습 니 다.함수 에 대한 구조 호출 이 라 고 합 니 다.
밤 을 들다
function foo(a) {
this.a = a;
}
var bar = new foo(2);
console.log(bar.a); //2
new 를 사용 하 는 과정 에서 새로운 대상 을 만 듭 니 다.this 는 이 새 대상 을 연결 합 니 다.함수 가 다른 대상 을 되 돌려 주지 않 으 면 new 표현 식 함수 호출 은 새 대상 을 되 돌려 줍 니 다.(이 새 대상 은 prototype 에 연 결 됩 니 다)네 가지 바 인 딩 규칙 의 우선 순 위 는 new>명시 적>암시 적>기본 값 입 니 다.
화살표 함수
화살표 함 수 는 외층 작용 역(함수 또는 전역)에 따라 this 를 결정 합 니 다.(이 메커니즘 대신 어법 작용 영역)
화살표 함수 this 는 호출 대상 을 연결 하고 화살표 함수 의 바 인 딩 을 수정 할 수 없습니다(new 도 안 됩 니 다).
사실은 화살표 함수 의 this 가 문법 적 으로 그 가 있 는 역할 영역(함수 또는 전체)의 this 를 계승 하고 계승 하 는 함수 역할 영역 인 this 바 인 딩 은 이 함수 에서 문맥 대상 을 호출 하기 때문에 화살표 함수 의 this 는 문맥 대상 에 간접 적 으로 연결 되 어 있 습 니 다.
약술:화살표 함수 this(귀속 작용 역 this)--작용 역 this(호출 상하 문 대상 에 귀속).
그러므로:화살표 함수 this==호출 된 상하 문 대상
밤 을 들다
function foo() {
setTimeout(function() {
// this foo()
console.log(this.a);
},100);
};
var obj = { a: 2 };
foo.call(obj); //2
사실 이 밤 도 다음 과 같다.
function foo() {
var that = this; //lexical capture of this
setTimeout(function() {
console.log(self.a)
},100);
}
...
그래서 두 가지 스타일 이 있 습 니 다.this 스타일(네 가지 규칙)과 품사 역할 도 메 인 스타일(that=this 와 화살표 함수)은 사용 할 수 있 습 니 다.사용 할 때 되도록 혼용 을 피해 야 한다.그렇지 않 으 면 유지 하기 어 려 운 결 과 를 초래 할 수 있다.위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 자바 script 의 this 역할 에 대한 상세 한 해석 과 통합 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Javascript에서 Math.max와 Math.max.apply의 차이점과 용법 상세 설명최근에 작은 사례를 만들 때 Math를 만났어요.max.apply라는 용법은 이전에 보기 드물게 재미있게 느껴졌으니 기록해 보세요. 1Math.max 문법:Math.max(n1,n2,n3,...,nX)반환값:max(...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.