}
bar() // AO.bar()와 동일
}
활성 객체는 항상 다음과 같이 반환되며 값은 null입니다. 즉, 의사 코드의 AO.bar()는 null.bar()와 동일합니다. 여기서는 전역 객체로 설정된 위에서 다시 설명한 예제로 돌아갑니다.
한 가지 예외가 있습니다. with 객체에 함수 이름 속성이 포함된 경우 해당 함수는 with 문의 내부 블록에서 호출됩니다. With 문은 개체 범위 앞, 즉 활성 개체 앞에 추가됩니다. 이에 따라 기본 개체가 더 이상 활성 개체가 아니라 with 문의 개체인 참조 유형(식별자 또는 속성 접근자를 통해)이 있습니다. 그건 그렇고, 이는 내부 함수뿐만 아니라 전역 함수에도 관련이 있습니다. 왜냐하면 with 개체가 범위 체인의 맨 앞 개체(전역 개체 또는 활성 개체)보다 빠르기 때문입니다.
var x = 10; 🎜>with ({
foo: function () {
alert(this.x);
},
x: 20
}) {
foo(); // 20
}
// 왜냐하면
var fooReference = {
base: __withObject,
propertyName: 'foo '
};
catch 문 함수 호출의 실제 매개변수에서도 동일한 상황이 발생합니다. 이 경우 catch 개체가 범위 앞에 추가됩니다. 활성 개체 또는 전역 개체 Front. 그러나 이 특정 동작은 ECMA-262-3의 버그로 확인되었으며, 이는 ECMA-262-5의 새 버전에서 수정되었습니다. 이런 방식으로 특정 활성 개체에서 이는 전역 개체를 가리킵니다. 캐치 개체가 아닌.
try {
throw function() {
alert(this);
};
} catch(e) {
e(); // ES3 표준은 __catchObject, ES5 표준은 전역
// 아이디어
var eReference = {
base: __catchObject,
propertyName: 'e'
}// 이 문제는 새로운 버전에서 수정되었습니다. ES5 표준 이 버그는
// 이것이 전역 객체입니다
var eReference = {
base: global,
propertyName: 'e'
}
이름이 지정된 함수에 대한 재귀 호출에서도 동일한 상황이 발생합니다(함수에 대한 자세한 내용은 15장 함수 참조). 함수의 첫 번째 호출에서 기본 개체는 상위 활동 개체(또는 전역 개체)입니다. 재귀 호출에서 기본 개체는 함수 표현식의 선택적 이름을 저장하는 특정 개체여야 합니다. 그러나 이 경우 이는 항상 전역 개체를 가리킵니다.
코드 복사
!bar && foo(1); // "는" 특수 객체여야 하지만 항상 (올바른) 전역
})(); / global
생성자로 호출되는 함수에서
이 값과 관련된 또 다른 상황은 생성자에 대한 호출인 함수의 컨텍스트에 있습니다.
코드 복사
코드는 다음과 같습니다. function A() { alert (this) ; // "a" 객체 아래에 새 속성을 만듭니다. this.x = 10
}
var a = new A()
alert(a.x) ; // 10
이 예에서 new 연산자는 "A" 함수의 내부 [[Construct]] 메서드를 호출한 다음 객체가 생성된 후 내부 [[ 통화]] 방법. 동일한 함수 "A"는 새로 생성된 객체에 이 값을 설정합니다.
함수 호출에서 this 값을 수동으로 설정
함수 프로토타입에 정의된 두 가지 메서드(모든 함수가 액세스할 수 있도록)를 사용하면 함수 호출에서 this 값을 수동으로 설정할 수 있습니다. .apply 및 .call 메소드입니다. 그들은 this 값으로 받아들이는 첫 번째 인수를 사용하고, 이는 호출 범위에서 사용됩니다. 이 두 메서드의 차이는 매우 작습니다. .apply의 경우 두 번째 매개 변수는 배열(또는 인수와 같은 배열과 유사한 개체)이어야 합니다. 결과적으로 .call은 모든 매개 변수를 허용할 수 있습니다. 두 메서드 모두에 필요한 매개 변수는 다음과 같습니다. 첫 번째 ——이것.
예:
코드 복사
코드는 다음과 같습니다. var b = 10; function a(c) { alert(this.b)
alert(c); >a(20) ; // this === 전역, this.b == 10, c == 20
a.call({b: 20}, 30) // this === {b: 20} , this.b == 20, c == 30
a.apply({b: 30}, [40]) // this === {b: 30}, this.b = = 30, c = = 40
결론
이 글에서는 ECMAScript에서 이 키워드의 특징에 대해 논의했습니다(C와 Java에 비해 실제로 특징입니다). 이 기사가 ECMAScript에서 this 키워드가 어떻게 작동하는지 정확히 이해하는 데 도움이 되었기를 바랍니다. 다시 한 번 댓글을 통해 귀하의 질문에 답변해 드리겠습니다.
기타 참고자료