JavaScript에서 함수가 객체에 속하는 경우 객체를 통해 함수에 액세스하는 동작을 "메소드 호출"이라고합니다. 일반 함수 호출과 달리 메소드 호출을 할 때 함수의 참조가 변경됩니다. 이것은 함수를 호출하는 데 사용되는 개체를 참조합니다 (이 개체는 메소드 호출의 호출 컨텍스트가됩니다).
코드 사본은 다음과 같습니다.
var x = 99;
var 샘플 = {
x : 1,
법 : 기능 (a) {
this.x = a*a; // 글로벌 오브젝트의 x가 아닌 샘플의 x에 값을 할당합니다.
}
}
샘플 (6);
Console.log (sample.x); // 36
Console.log (x); // 99
객체의 속성 액세스와 마찬가지로 DOT 연산자를 사용하는 것 외에도 JavaScript는 브래킷 연산자를 사용하여 메소드 호출을 할 수도 있습니다.
코드 사본은 다음과 같습니다.
// 메소드를 호출하는 다른 방법
샘플 [ "act"] (7);
Console.log (sample.x); // 49
JavaScript의 함수의 경우 흥미로운 동작은 함수에 함수 (폐쇄)를 포함시키는 것입니다. 메소드 호출을 할 때 메소드 함수에 포함 된 함수가있는 경우이 내장 기능의 코드는 외부 변수 값에 액세스 할 수 있습니다.
코드 사본은 다음과 같습니다.
// 중첩 된 함수는 그 외부에서 변수에 액세스 할 수 있습니다.
var y = 88;
var sample2 = {
Y : 1,
ACT2 : 기능 (a) {
this.y = inner ();
함수 내부 () {
a*a를 반환합니다.
}
}
}
샘플 2.Act2 (8);
Console.log (sample2.y); // 64
Console.log (y); // 88
그러나 직관과 달리 함수에 포함 된 코드는 이것을 외부에서 물려받을 수 없습니다. 즉, 임베디드 함수에서 이것은 메소드를 호출하는 객체가 아니라 글로벌 객체를 나타냅니다.
코드 사본은 다음과 같습니다.
// 중첩 된 함수는 "this"를 상속하지 않습니다. 중첩 된 기능의 "이것"은 글로벌 객체입니다
var sample3 = {
act3 : function () {
안의();
함수 내부 () {
Console.log (this); // 창 객체
}
}
}
sample3.act3 ();
임베디드 함수의 메소드를 호출하는 객체에 실제로 액세스 해야하는 경우이 값을 외부 함수의 변수로 저장할 수 있습니다.
코드 사본은 다음과 같습니다.
// "this"를 중첩 된 함수로 전달합니다
var sample4 = {
ACT4 : function () {
var self = 이것;
안의();
함수 내부 () {
console.log (self); // object {act4 = function ()}
}
}
}
sample4.act4 ();