Javascritp에서 이것은 반드시 객체 방법의 유일한 컨텍스트 일 필요는 없습니다.
함수 호출 방식에 따라 전역 객체, 현재 객체 또는 객체 일 수 있습니다. JavaScript에서 함수를 호출하는 방법에는 여러 가지가 있습니다. 객체 메소드 호출, 기능 호출, 생성자 호출, 적용 또는 통화 사용을 사용합니다.
1. 객체 메소드로 호출하십시오
JavaScript에서는 기능이 객체의 속성으로 사용될 수 있습니다.
코드 사본은 다음과 같습니다.
var point = {
x : 0,
Y : 0,
moveto : function (x, y) {
this.x = this.x + x;
this.y = this.y + y;
}
};
Point.Moveto (1, 1) // 이것은 현재 객체, 즉 포인트 객체에 묶여 있습니다.
2. 함수 호출
함수는 직접 호출 될 수 있으며 이는 전역 객체에 바인딩됩니다. 브라우저에서 창은 글로벌 객체입니다. 예를 들어, 다음 예제 : 함수가 호출되면이 기능은 글로벌 오브젝트에 바인딩되고 다음은 다음에 실행되며, 이는 다음 전역 변수를 암시 적으로 선언하는 것과 동일합니다. 이는 분명히 발신자가 원하는 것이 아닙니다.
코드 사본은 다음과 같습니다.
함수 makenosense (x) {
this.x = x;
}
Makenosense (5);
x; // x는 값이 5 인 글로벌 변수가되었습니다.
내부 함수의 경우, 즉 다른 기능의 본문 내에서 선언 된 기능의 경우, 이러한 글로벌 객체에 바인딩하는 방법은 다른 문제를 일으킬 것입니다. 우리는 앞에서 언급 한 포인트 객체를 예제로 사용합니다. 결과는 예상치 못한 일일 수 있습니다. 포인트 객체는 움직이지 않을뿐만 아니라 두 개의 추가 글로벌 변수 x와 y가 있습니다.
코드 사본은 다음과 같습니다.
var point = {
x : 0,
Y : 0,
moveto : function (x, y) {
// 내부 함수
var movex = function (x) {
this.x = x; // 이것은 어디에 묶여 있습니까?
};
// 내부 함수
var movey = function (y) {
this.y = y; // 이것은 어디에 묶여 있습니까?
};
movex (x);
Movey (Y);
}
};
Point.Moveto (1, 1);
Point.x; /==> 0
Point.y; /==> 0
x; // ==> 1
y; // ==> 1
이것은 JavaScript의 디자인 결함입니다. 올바른 디자인 방법은이 기능 이이 설계 결함에 해당하는 객체에 묶여 있어야합니다.
코드 사본은 다음과 같습니다.
var point = {
x : 0,
Y : 0,
moveto : function (x, y) {
var that = this;
// 내부 함수
var movex = function (x) {
that.x = x;
};
// 내부 함수
var movey = function (y) {
that.y = y;
}
movex (x);
Movey (Y);
}
};
Point.Moveto (1, 1);
Point.x; /==> 1
Point.y; /==> 1
생성자라고합니다
JavaScript는 객체 지향 프로그래밍을 지원합니다. 주류 객체 지향 프로그래밍 언어와 달리 JavaScript는 클래스 개념이 없지만 프로토 타입 기반 상속 방법을 사용합니다. 이에 따라 JavaScript의 생성자도 새 통화를 사용하지 않으면 일반 기능과 동일합니다. 또 다른 기존의 규칙으로서, 생성자는 대문자로 시작하여 발신자가 올바른 방식으로 전화하도록 상기시킵니다. 호출이 올바른 경우 새로 생성 된 개체에 제대로 묶여 있습니다.
코드 사본은 다음과 같습니다.
기능 지점 (x, y) {
this.x = x;
this.y = y;
}
적용 또는 전화를 사용하여 호출됩니다
JavaScript 함수에서 객체, 객체에는 메소드가 있으며 적용 및 호출은 기능 객체의 메소드입니다. 이 두 가지 방법은 매우 강력하며 함수 실행의 컨텍스트, 즉 객체에 바인딩되는 객체를 전환 할 수 있습니다. 이 방법은 많은 JavaScript 기술 및 클래스 라이브러리에 사용됩니다. 특정 예를 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
기능 지점 (x, y) {
this.x = x;
this.y = y;
this.moveto = function (x, y) {
this.x = x;
this.y = y;
}
}
var p1 = 새로운 포인트 (0, 0);
var p2 = {x : 0, y : 0};
p1.Moveto (1, 1);
p1.moveto.apply (p2, [10, 10]);
위의 예에서는 생성자를 사용하여 객체 P1을 생성합니다. 다른 방법 호출은 또한 동일한 함수를 가지며, 차이는 마지막 매개 변수가 배열로 균일하게 전달되지 않지만 별도로 전달된다는 것입니다.
코드 사본은 다음과 같습니다.
함수 foo () {
//1.이 참조 된 생성자는 argument.callee에 의해 참조 된 객체입니다
// 지침은 새 연산자를 통해 실행되는 생성자입니다
if (this.constructor == arguments.callee) {
경고 ( '개체 생성');
}
//2. 이것은 창입니다. 그런 다음 글로벌 호출입니다
if (this == 창) {
경고 ( '일반 호출');
}
그렇지 않으면 {// 3.
경고 ( ''+ this.constructor로 불림);
}
}
foo (); // 글로벌 기능 호출
foo.call (new Object ()); // 객체 객체의 멤버 메소드로 호출
New foo (); // 객체 구성을 실행하기 위해 새 연산자가 호출