JS 에서 this 의 4 가지 귀속 규칙 에 대한 상세 한 설명
this 를 이해 하기 전에 먼저 하나의 관점 을 바로 잡 습 니 다. this 는 함수 자 체 를 가리 키 지 않 을 뿐만 아니 라 함수 의 품사 작용 도 메 인 을 가리 키 지 않 습 니 다.
this 의 영어 해석 만 으로 는 오도 하기 쉽다.
그것 은 실제 함수 가 호출 될 때 발생 하 는 바 인 딩 입 니 다. 즉, this 가 무엇 을 가리 키 는 지 는 당신 이 어떻게 호출 하 는 함수 에 달 려 있 습 니 다.즉, 누가 this 를 호출 하면 this 는 누 구 를 가리 키 는 것 이다.
JS 에서 this 설명
ES6 의 화살표 함 수 는 어법 작용 역 을 사용한다.
왜 this 를 사용 합 니까? API 를 더욱 간결 하고 재 활용 하기 쉽게 설계 합 니 다.
this 는 자신 을 가리 키 지 않 고 함수 의 품사 작용 도 메 인 을 가리 키 지 않 습 니 다.
this 의 지향 은 함수 호출 방식 에 만 달 려 있 습 니 다.
이 귀속 규칙
new > 귀속 표시 > 스텔스 귀속 > 기본 귀속
기본 바 인 딩
독립 함수 호출 시 호출 스 택 에 있 든 없 든 this 는 전역 대상 (브 라 우 저 에서 window) 을 가리 키 고 있 습 니 다.
엄격 한 모드 에서 전역 대상 을 기본 바 인 딩 에 사용 할 수 없습니다.
var a = 2;
function foo(){
console.log(this.a);
}
function bar(){
var a = 5;
foo();
}
bar(); // 2
암시 적 바 인 딩
함수 가 컨 텍스트 대상 을 참조 할 때 암시 적 바 인 딩 규칙 은 함수 호출 중의 this 를 이 컨 텍스트 대상 에 연결 합 니 다.
대상 속성 참조 체인 에서 마지막 층 만 호출 위치 에서 역할 을 합 니 다.
요구: 대상 내부 에 지향 함수 의 속성 을 포함 해 야 합 니 다. 이 대상 은 이 속성 을 통 해 간접 적 으로 함 수 를 참조 할 수 있 습 니 다.
function foo() {
console.log( this.a );
}
var obj2 = {
a: 42,
foo: foo
};
var obj1 = {
a: 2,
obj2: obj2
};
obj1.obj2.foo(); // 42
스텔스 분실
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
var bar = obj.foo; // bar foo ,
var a = "oops, global"; // a
bar(); // "oops, global"
반전 함수 의 경우 (매개 변수 전달 시의 암시 적 할당)
function foo() {
console.log( this.a );
}
function doFoo(fn) {
// , fn = obj.foo,
fn(); //
명시 적 바 인 딩
콜 () 과 apply () 를 사용 하여 대상 (기본 형식 이면 패 키 징 함수 가 대상 - 포장) 으로 전 환 됩 니 다. this 를 이 대상 에 연결 합 니 다.
하 드 바 인 딩
function foo() {
console.log( this.a );
}
var obj = {
a: 2
};
var bar = function() {
foo.call( obj );
};
bar(); // 2
setTimeout( bar, 100 ); // 2
// bar , foo this
bar.call( window ); // 2
하 드 바 인 딩 의 전형 적 인 응용 은 다음 과 같은 패키지 함수 입 니 다.
function foo(something) {
console.log( this.a, something );
return this.a + something;
}
var obj = {
a: 2
};
var bar = function() {
return foo.apply( obj, arguments ); // obj
};
var b = bar( 3 ); // 2 3
console.log( b ); // 5
내부 함수 가 apply 로 특정한 대상 에 하 드 바 인 딩 될 것 입 니 다. 이 패키지 함 수 를 어떻게 호출 하 든 내부 함수 의 this 에 영향 을 주지 않 습 니 다.
bid 보조 함 수 는 다음 과 같 습 니 다.
function foo(something) {
console.log( this.a, something );
return this.a + something;
}
// simple `bind` helper
function bind(fn, obj) {
return function() {
return fn.apply( obj, arguments ); // obj
};
}
var obj = {
a: 2
};
var bar = bind( foo, obj ); // bind( foo, obj )
var b = bar( 3 ); // 2 3
console.log( b ); // 5
요약: 상기 소포 함 수 는 다른 함 수 를 감 싸 려 면 한 개 만 중복 적 으로 쓸 수 있 고 하 드 인 코딩 방식 으로 재 활용 되 지 못 하 며 특정한 기능 이 여러 번 반복 적 으로 사용 해 야 할 때 이 를 추상 화하 여 함수 가 됩 니 다.
새 바 인 딩
모든 함수 가 구조 함수 로 사 용 될 수 있 습 니 다. 함수 가 new 연산 자 '구조 호출' 되 었 을 때 다음 작업 을 수행 합 니 다.
1. 새 대상 만 들 기 (이 함수 가 JS 내 장 된 것 이 아니라면 새 Object 대상 만 들 기);
2. this 를 이 대상 에 귀속 하기;
3. 구조 함수 의 코드 를 실행 합 니 다 (이 새 대상 에 속성 추가).
4. 함수 가 다른 대상 으로 돌아 가지 않 으 면 자동 으로 이 새 대상 으로 돌아 갑 니 다.함수 에 return 이 돌아 오 는 시비 대상 이 있 으 면 자동 으로 이 새 대상 을 되 돌려 줍 니 다. 즉, 그 비 대상 을 덮어 씁 니 다.
function foo(a) {
this.a = a;
}
var bar = new foo( 2 );
console.log( bar.a ); // 2
보충 설명
간접 인용
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(), p.foo() o.foo()
화살표 함수: 이 네 개의 this 규칙 을 사용 하지 않 고 문법 작용 역 에 따라 this 를 결정 합 니 다.
function foo() {
//
return (a) => {
// `this` here is lexically adopted from `foo()`
console.log( this.a );
};
}
var obj1 = {
a: 2
};
var obj2 = {
a: 3
};
// foo() , this obj1
var bar = foo.call( obj1 ); // foo.call( obj1 ) , bar
bar.call( obj2 ); // 2! this ,new
화살표 함수 와 같은 모드 입 니 다:
function foo() {
var self = this; // lexical capture of `this`
setTimeout( function(){
console.log( self.a );
}, 100 );
}
var obj = {
a: 2
};
JS 의 this 대상 에 관 한 더 많은 글 은 아래 링크 를 클릭 하 실 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.