이것은 함수 내부의 특별한 객체입니다. 이는 기능이 실행되는 환경 객체를 나타냅니다 (기사 끝에서 추가 설명을 할 것입니다). 기능을 호출하기 전에 이것의 값은 확실하지 않습니다. 다른 호출 방법으로 인해이 값이 변경됩니다.
window.num = 22; var o = {num : 11}; 함수 saynum () {alert (this.num)} saynum (); // 22o.saynum = saynum; o.saynum (); // 11기억하십시오 : 함수 이름은 포인터를 포함하는 변수 일뿐입니다. 따라서 다른 환경에서 실행 되더라도 Global Saynum () 함수는 여전히 O.SayNum ()과 동일합니다.
1. 글로벌 범위에서 함수를 호출 할 때
글로벌 범위에서 호출되는이 개체는 창을 나타냅니다.
익명 함수의 실행은 전역 이므로이 객체는 일반적으로 창을 가리 킵니다.
함수 fn1 () {console.log (this);} fn1 ();2. 새로운 운영자를 통해 호출
이것은 인스턴스 객체를 참조합니다
기능인 (이름) {this.name = name;} person.prototype.printname = function () {alert (this.name); // byron}; var p1 = new person ( 'byron');3. 메소드는 객체로 호출됩니다
이것은 객체를 참조합니다
var obj1 = {name : 'byron', fn : function () {console.log (this); }}; obj1.fn ();4. 간접 전화
전화하고 신청하십시오
각 함수에는 두 가지 비인간 메소드가 포함되어 있습니다 : call () 및 apply (). 이 두 가지 방법의 목적은 기능을 특정 범위로 호출하는 것입니다. 이는 실제로 기능 본문 에서이 객체의 값을 설정하는 것과 같습니다. 다시 말해, 함수는 직접 호출되며 실행 환경은 호출 할 때 지정됩니다.
wind
(1) 방법을 적용하십시오
두 개의 매개 변수를 수신합니다. 하나는 함수에서 실행되는 함수의 범위이고 다른 하나는 매개 변수 배열입니다.
(2) 호출 방법
호출 방법은 적용 메소드와 동일하며 차이점은 매개 변수를 수신하는 방법이 다르다는 것입니다. 호출 메소드의 경우 첫 번째 매개 변수는이 값이 변경되지 않았으며 변경은 다른 매개 변수가 함수로 직접 전달된다는 것입니다.
함수 fn () {console.log (this) // windwow 함수 innerfn () {console.log (this)} innerfn.call (this) // window} fn (); 함수 fn0 () {console.log (this) // window} 함수 fn1 () {fn0.call (this); console.log (this); // window} fn1 (); 함수 fn0 () {console.log (this) // object} var o = {fn1 : function fn1 () {fn0.call (this); console.log (this); // object}} o.fn1 ();5.Bind 방법
이 메소드는 값이 bind () 함수로 전달 된 값에 바인딩되는 함수의 인스턴스를 만듭니다. 즉, 새로운 함수가 반환되고 기능 내부는 첫 번째 매개 변수가 전달됩니다.
window.color = 'red'; var o = {color : 'blue'}; function saycolor () {alert (this.color)} var objectsayColor = saycolor.bind (o); ObjectSayColor (); // blue보충 메모 : 환경 정의 실행
기능이 액세스 할 수있는 변수 또는 기타 데이터를 정의합니다. 각 실행 환경에는 이와 관련된 가변 객체가 있습니다. 환경에 정의 된 모든 변수와 함수는이 객체에 저장됩니다. 우리가 쓴 코드는이 객체에 액세스 할 수 없지만 파서는 데이터를 처리 할 때 백그라운드에서 사용합니다.
1. 실행 환경 생성 :
1. 글로벌 실행 환경
웹 브라우저에서 글로벌 실행 환경은 창 객체로 간주되므로 모든 글로벌 변수 및 함수는 창 객체의 속성 및 메소드로 작성됩니다. 코드가 브라우저에로드되면 글로벌 실행 환경이 생성됩니다 (글로벌 실행 환경은 웹 페이지 나 브라우저를 닫을 때만 파괴됩니다).
2. 지역 실행 환경
각 함수에는 자체 실행 환경이 있으므로 로컬 실행 환경은 기능 객체입니다. 함수가 호출되면 함수의 로컬 환경이 생성됩니다 (함수의 코드가 실행 된 후에는 환경이 파괴되고 저장된 모든 변수 및 기능 정의도 파괴됩니다).
이 실행 환경 및 관련 변수 객체는 다음과 같이 설명 된 추상 개념입니다.
var a = 1; 함수 fn (num1, num2) {var b = 2; 함수 fninner () {var c = 3; 경고 (A + B + C); } fninner (); // fninner가} fn (4,5)이라고 불리는 경우 로컬 실행 환경 생성; // fn이 호출 될 때 로컬 실행 환경 생성2. 스코프 체인
JavaScript 함수의 실행은 스코프 체인을 사용합니다. 이 범위 체인은 함수가 정의 될 때 생성됩니다. 함수가 정의되면 실제로 스코프 체인을 저장합니다. 이 함수가 호출되면 로컬 변수를 저장하는 새 개체를 생성 하고이 객체를 저장된 스코프 체인에 추가합니다. 스코프 체인의 프론트 엔드는 항상 실행 된 코드가 위치한 환경에서 항상 가변 객체입니다. 스코프 체인의 끝은 항상 글로벌 실행 환경의 가변 객체입니다. 범위 체인의 목적은 실행 환경에 액세스 할 수있는 권한이있는 모든 변수와 기능이 액세스 할 수 있도록하는 것입니다.
var scope = 'global scope'; function checkscope () {var scope = '로컬 스코프'; 함수 f () {return scope}; return f;} checkscope () (); // 로컬 스코프이해 : CheckScope가 호출되면 함수 F가 정의되어 CheckScope 스코프 체인에 로컬 변수로 바인딩됩니다. 따라서 함수 F가 어디에 있든 상관 없이이 바인딩은 여전히 유효하므로 리턴 값은 로컬 범위입니다.
var num1 = 1; 함수 외부 () {var num2 = 2; console.log (num1 + num2); // 3 함수 inner () {// 여기에서 num3, num2, num1 var num3 = 3에 액세스 할 수 있습니다. console.log (num1 + num2 + num3); // 6} // 여기에서 num2, inner (), num1에 액세스 할 수 있지만 num3 내부 ();} outer (); console.log (// 1); 실행 환경에 액세스 할 수 있습니다.스코프 체인 (검색) : 내부 환경은 스코프 체인을 통해 모든 외부 환경에 액세스 할 수 있지만 외부 환경은 내부 환경의 변수와 기능에 액세스 할 수 없습니다.
var name = 'byron'; 함수 fn () {var name = 'csper'; console.log (name); // casper} fn ();내부 환경이 많을수록 가변 무게가 높아집니다.
참고 : VAR 키워드로 직접 선언되지 않은 변수는 글로벌 변수입니다. 예를 들어, a = 1이 직접 선언되면 a는 현재 글로벌 변수입니다.
Javscript 엔진이 스코프에 들어가면 코드를 두 라운드로 처리합니다. 첫 번째 라운드는 변수를 초기화합니다. 두 번째 라운드는 코드를 실행합니다
var a = 1; 함수 교도소 (a) {console.log (a); // 1 var a; Console.log (a); // 1} 교도소 (1);3. 기능 실행
함수 호출이 실행 환경에 들어가면 첫 번째 프로세스 인수, 공식 매개 변수를 초기화하고 (기본값이 정의되지 않음) 함수의 함수 선언을 초기화합니다. 코드가 단계별로 실행되면 함수의 변수 선언이 초기화됩니다 (환경에 들어간 후 코드가 실행되지 않으면 값이 정의되지 않음). 따라서 함수의 초기화 순서는 공식 매개 변수, 함수 선언 및 변수 선언입니다. 위의 그림에서 볼 수 있습니다. 예를 들어 보겠습니다 (전체 글로벌 환경도 기능입니다).
ALERT (FNOF FN); // 함수, 기능 선언은 미리 알림 (fn0 유형); // 정의되지 않은 변수 선언을 미리 미리 지정하지 않지만 fn () {// function expression} var fn0 = function ()} alert (typeof fn0); // 함수가 할당 된 시간에 변수가 지정되었습니다.