이 객체는 항상 js의 함정이었습니다. 그것이 무엇을 가리키는지 판단하기가 어렵고, C나 Python의 self에 대한 경험으로 인해 이러한 유형의 실수를 자주 저지릅니다. 다음으로 이 객체의 소유권에 대해 자세히 이야기해 보겠습니다.
rule1: 지구 환경의
JavaScript의 환경은 본질적으로 함수에 의해 결정됩니다. JS에서는 컨텍스트를 코드 블록으로 구분할 수 없습니다. 함수로 래핑되지 않은 환경은 전역 변수 창을 가리킵니다. 다음 예
rule2: this
메소드로 호출되는 경우분명히 이 상황은 판단하기 쉽습니다. 이는 Python에서 self와 일치합니다. 이는 의심할 여지없이
메서드를 호출하는 개체를 가리킵니다.rule3: this
생성자로 사용되는 경우물론 이때는 새로 생성된 객체를 가리키는 것이 분명합니다. 생성자를 실행하면 실제로 객체가 생성되지 않고 초기화만 됩니다.
다음은 몇 가지 예입니다
규칙4: 간접 호출의 경우
소위 간접 호출은 호출 기능에 적용 및 호출을 사용하는 것을 의미합니다. 이때 이는 해당 매개변수 목록의 첫 번째 매개변수를 가리킵니다.
규칙5: 다른 상황에서는 이
이는 다른 경우에도 변경되지 않으며 실수가 발생할 가능성이 가장 높다는 점을 기억하세요.
위 코드가 사람을 가리키는 게 이상하지 않나요?
중첩된 함수의 this는 중첩된 함수를 가리키지 않는다는 점을 기억해야 합니다. 이 예에서 sayhello의 this는 hello에 해당하는 함수를 가리키지 않습니다. 예를 살짝 바꿔서
현재 sayhello는 메서드로 호출되지 않으므로 전역 개체를 가리킨다는 점을 모두가 이해해야 합니다. . .
이때 문제가 발생합니다. node를 사용하여 초기 예제를 실행하면 정의되지 않은 hello world가 표시됩니다. 설명할 수 있는 사람이 있는지 궁금합니다.
rule6:eval이 모든 규칙을 위반합니다
마침내 예시로 마무리
이해하셨나요?