JavaScript에서 이는 반드시 객체 메서드의 컨텍스트에서만 발견되는 것은 아닙니다. 전역 함수 호출 및 기타 여러 컨텍스트에도 이 참조가 있습니다.
전역 개체, 현재 개체 또는 모든 개체가 될 수 있으며 모두 함수가 호출되는 방식에 따라 다릅니다. JavaScript에서 함수를 호출하는 방법에는 객체 메서드, 함수, 생성자, 적용 또는 호출 등 여러 가지가 있습니다.
1. 객체 메소드로 호출
자바스크립트에서는 함수도 객체이므로 함수를 객체의 속성으로 사용할 수 있습니다. 이때 함수를 객체의 메소드라고 부르게 되면 자연스럽게 객체에 바인딩됩니다.
2. 함수 호출
함수를 직접 호출할 수도 있으며, 이 경우 전역 개체에 바인딩됩니다. 브라우저에서 window는 전역 개체입니다. 예를 들어, 다음 예에서는 함수가 호출되면 this가 전역 개체에 바인딩된 다음 할당 문이 실행됩니다. 이는 암시적으로 호출자가 원하는 것이 아닌 전역 변수를 선언하는 것과 같습니다.
};
point.moveTo(1, 1)
point.x; //==>0
point.y; //==>0
x; //==>1
y; //==>1
이것은 JavaScript의 설계 결함입니다. 올바른 설계 방법은 내부 함수의 this가 외부 함수에 해당하는 개체에 바인딩되어야 한다는 것입니다. 이 설계 결함을 피하기 위해 똑똑한 JavaScript 프로그래머는 변수 대체를 생각해 냈습니다. . 메서드는 관례에 따라 일반적으로 변수 이름이 지정됩니다.
코드 복사
생성자로 호출
JavaScript는 객체지향 프로그래밍을 지원합니다. 주류 객체지향 프로그래밍 언어와 달리 JavaScript에는 클래스 개념이 없으며 프로토타입 기반 상속을 사용합니다. 그에 따라 JavaScript의 생성자도 매우 특별합니다. new로 호출되지 않으면 일반 함수와 동일합니다. 또 다른 규칙으로 생성자는 호출자에게 올바른 방식으로 호출하도록 상기시키기 위해 대문자로 시작합니다. 올바르게 호출되면 새로 생성된 객체에 바인딩됩니다.
신청 또는 전화문의
자바스크립트에서는 함수도 객체이고, 객체에는 Apply와 Call이 함수 객체의 메소드라는 점을 다시 한 번 강조하겠습니다. 이 두 가지 방법은 함수가 실행되는 컨텍스트, 즉 이것이 바인딩되는 개체를 전환하는 데 매우 강력합니다. JavaScript의 많은 기술과 라이브러리가 이 방법을 사용합니다. 구체적인 예를 살펴보겠습니다.
위의 예에서는 생성자를 사용하여 moveTo 메소드가 있는 객체 p1을 생성합니다. 객체 리터럴을 사용하여 다른 객체 p2를 생성하고 Apply를 사용하면 p1의 메소드를 p2에 적용할 수 있음을 알 수 있습니다. , 이번에는 객체 p2에도 바인딩됩니다. 또 다른 메소드 호출에도 동일한 기능이 있지만 차이점은 마지막 매개변수가 배열로 균일하게 전달되지 않고 별도로 전달된다는 점입니다.
코드 복사