JavaScript는 기능 프로그래밍, 클로저, 프로토 타입 기반 상속 등과 같은 고급 기능을 지원하는 스크립팅 언어입니다. JavaScript는 처음에는 시작하기 쉬운 것처럼 보이지만 실제로는 JavaScript를 마스터하기가 어렵고 일부 기본 개념은 놀랍습니다. 그중에서도 자바 스크립트의 키워드는 비교적 혼란스러운 개념입니다. 다른 시나리오에서는 다른 객체가됩니다. JavaScript 에서이 키워드를 올바르게 마스터하면 JavaScript 언어의 임계 값을 입력 할 수 있다는 견해가 있습니다. 주류 객체 지향 언어 (예 : Java, C#등)에서는 명확하고 구체적으로 현재 객체를 가리키는 것을 의미합니다. 일반적으로 컴파일 기간 동안 제한됩니다. 이것은 JavaScript에서 런타임 동안 제한되며,이 키워드가 JavaScript에서 여러 의미를 갖는 이유입니다.
런타임 동안의 바인딩 기능으로 인해 JavaScript의 이것은 전역 객체, 현재 객체 또는 객체 일 수 있으며, 이는 기능이 호출되는 방식에 전적으로 의존 할 수 있습니다. JavaScript에서 기능을 호출하는 방법에는 여러 가지가 있습니다.
객체 메소드라고합니다.
함수 호출로서;
생성자로 불립니다.
적용하거나 전화를 요청하십시오.
말이 진행됨에 따라 캐릭터는 형태만큼 좋지 않으며 형태는 그림만큼 좋지 않습니다. 사람들 이이가 가리키는 JavaScript를 더 잘 이해하도록하기 위해? 다음은 설명 할 사진입니다.
위의 그림에서 나는 그것을 "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) 함수는 새로 호출되지 않고 거부권을 입력하고 // DOT (.)로 호출 된 다음 .Moveto, 즉 PointPoint.Moveto (1,1) 앞에 호출 객체를 가리 킵니다. // 이것은 현재 객체, 즉 포인트 객체에 바인딩됩니다.Point.Moveto 함수 호출은 새로운 것입니까? 이것은 분명히 아닙니다. "아니오"브랜치로 들어가는 기능은 Dot (.)로 호출되는 기능입니까? ;
Point.Moveto 함수는 DOT (.)로 호출됩니다. 즉, "예"브랜치로 들어갑니다.
그림 포인트 에서이 점에 대한 분석 다이어그램은 다음 그림에 표시됩니다.
또 다른 예를 들어 다음 코드를 살펴 보겠습니다.
함수 func (x) {this.x = x; } func (5); // 이것은 전역 객체 창입니다. X는 전역 변수입니다. // 의사 결정 트리 분석 : func () 함수가 새로 호출됩니까? 아니요, func () 함수를 입력 할 때 DOT로 호출됩니까? 아니요, 이것은 글로벌 객체 Windowx를 가리 킵니다. // x => 5"JavaScript이 의사 결정 트리"에서 func () 함수를 결정하는 프로세스는 다음과 같습니다.
func (5) 기능 호출이 새로운 것으로 호출됩니까? 이것은 분명히 아닙니다. "아니오"브랜치로 들어가는 기능은 Dot (.)로 호출되는 기능입니까? ;
func (5) 함수는 DOT (.)로 호출되지 않습니다.
이 func 함수가 가리키는 것에 대한 분석 다이어그램은 다음 그림에 표시됩니다.
함수로 직접 호출하는 방법은 복잡한 예를 보겠습니다.
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; // => 1movex () 및 movey () 함수의 실제 내부 호출. "JavaScript이 의사 결정 트리"에서 movex () 함수 내부에서 이것을 결정하는 과정은 다음과 같습니다.
MoveX (1) 기능 호출이 새로운 것으로 호출됩니까? 이것은 분명히 아닙니다. "아니오"브랜치로 들어가는 기능은 Dot (.)로 호출되는 기능입니까? ;
MoveX (1) 함수는 DOT (.)로 호출되지 않습니다. 즉, "아니오"브랜치로 들어갑니다.
생성자 호출의 예를 살펴 보겠습니다.
함수점 (x, y) {this.x = x; // 이것 ? this.y = y; // this?} var np = 새로운 포인트 (1,1); np.x; // 1var p = point (2,2); px; // 오류, p는 빈 객체 undefinedwindow.x입니다. // 2지점 (1,1) 함수에서 "JavaScript이 의사 결정 트리"에서 이것을 결정하는 과정은 다음과 같습니다.
var np = 새로운 요점 (1,1) 전화가 새로운 것과 함께 전화합니까? 이것은 분명히 "예"지점에 들어가는 것입니다. 즉, 이것은 NP를 가리 킵니다.
그런 다음 this.x = 1, 즉 NP.X = 1;
var p = point (2,2)에서 포인트 (2,2) 함수의 "JavaScript이 의사 결정 트리"에서 이것을 결정하는 과정은 다음과 같습니다.
var p = point (2,2) 호출이 새로 호출됩니까? 이것은 분명히 아닙니다. "아니오"브랜치로 들어가는 기능은 Dot (.)로 호출되는 기능입니까? ;
점 (2,2) 기능이 DOT (.)로 호출되지 않았습니까? 아니오로 결정됩니다. 즉, "아니오"브랜치를 입력하십시오.
this.x = 2는 window.x = 2를 의미합니다.
마지막으로 전화 및 적용으로 기능을 호출하는 예를 살펴 보겠습니다.
함수점 (x, y) {this.x = x; this.y = y; this.moveto = function (x, y) {this.x = x; this.y = y; }} var p1 = new Point (0, 0); var p2 = {x : 0, y : 0}; p1.moveto.apply (p2, [10, 10]); // 실제로 P2.Moveto (10, 10) P2.X // 10입니다"JavaScript이 의사 결정 트리"에서 함수 p1.moveto.apply (p2, [10,10])를 결정하는 과정은 다음과 같습니다.
우리는 두 가지 방법이 적용되고 호출되는 것이 매우 강력하다는 것을 알고 있으며, 기능 실행의 컨텍스트, 즉 객체, 즉 이에 바인딩되는 객체를 전환 할 수 있습니다. P1.Moveto.Apply (P2, [10,10])는 실제로 P2.Moveto (10,10)입니다. 그런 다음 p2.moveto (10,10)는 다음과 같이 해석 될 수 있습니다.
함수 호출이 새로 호출됩니까? 이것은 분명히 아닙니다. "아니오"브랜치로 들어가는 기능은 Dot (.)로 호출되는 기능입니까? ;
p2.moveto (10,10) 함수는 dot (.)로 호출됩니다. 즉, "예"분기에 들어갑니다. 전에는 p2.x = 10입니다.
JavaScript 기능 실행 환경의 프로세스와 관련하여 IBM DeveloperWorks 문서 라이브러리의 설명은 매우 좋습니다. 발췌문은 다음과 같습니다.
"JavaScript의 기능은 일반 기능 또는 객체로 실행될 수 있습니다. 이것이 너무 풍부한 주된 이유입니다. 함수가 실행되면 실행 환경 (실행 콘텐츠)이 생성되고 기능의 모든 동작 이이 실행 환경에서 발생합니다. 실행 환경에서 먼저, JavaScript를 구축 할 때, 다음에 인수가 포함됩니다. 변수를 초기화하고, 기능의 공식적인 매개 변수 테이블을 초기화하십시오. 값은 인수 변수에 해당하는 값이 없다면, 내부 기능이 초기화되면 내부 기능이 포함됩니다. 실행 환경 (ExecutionContext)이 성공적으로 생성 된 후에는 할당이 실행됩니다 (executionContext)가 성공적으로 생성되고 함수는 라인별로 실행되기 시작하며 필요한 변수는 이전에 구축 된 실행 환경 (executionContext)에서 읽습니다. "
이 구절을 이해하는 것은 JavaScript 기능을 이해하는 데 큰 도움이 될 것입니다.