함수는 호출될 때만 실행됩니다. 호출 연산자는 함수 값을 생성하는 표현식 뒤에 오는 괄호 쌍입니다. 괄호에는 0개 이상의 쉼표로 구분된 표현식이 포함될 수 있습니다. 각 표현식은 매개변수 값을 생성하고 각 매개변수 값에는 함수 선언 시 정의된 형식 매개변수 이름이 할당됩니다
JavaScript에는 함수 호출 모드, 메서드 호출 모드, 생성자 호출 모드, 간접 호출 모드 등 총 4가지 호출 모드가 있습니다
【1】함수 호출 모드
함수가 객체의 속성이 아닌 경우 함수라고 합니다. 일반 함수 호출의 경우 함수의 반환 값은 호출 표현식의 값입니다.
function add(x,y){ return x+y; } var sum = add(3,4); console.log(sum)//7
함수 호출 모드를 사용하여 함수를 호출할 때 비엄격 모드에서는 this가 전역 개체에 바인딩됩니다. is unundefined
function add(x,y){ console.log(this);//window} add();
function add(x,y){ 'use strict'; console.log(this);//undefined } add();//window
따라서 'this'를 사용하면 현재가 strict 모드인지 확인할 수 있습니다
var strict = (function(){return !this;}());
Rewriting
함수 호출 모드의 함수에서 this가 전역 개체에 바인딩되어 있기 때문에 전역 속성이 나타나는 현상이 재작성이 발생합니다
var a = 0; function fn(){ this.a = 1; } fn(); console.log(this,this.a,a);//window 1 1
【2】메서드 호출 패턴
함수가 객체의 속성으로 저장되면 이를 메소드라고 부릅니다. 메소드가 호출되면 이는 객체에 바인딩됩니다. 호출 표현식에 속성을 추출하는 작업이 포함된 경우 해당 메서드는 이를 사용하여 자신이 속한 개체에 액세스할 수 있으므로 개체에서 값을 가져오거나 개체를 수정할 수 있습니다. 이것을 객체에 바인딩하는 것은 호출 시 발생합니다. 이를 통해 자신이 속한 개체의 컨텍스트를 얻을 수 있는 메서드를 공용 메서드라고 합니다
var o = { m: function(){ console.log(1); } }; o.m();//1
메서드로 호출되는 모든 함수는 실제로 암시적 실제 매개변수를 전달합니다. 이 실제 매개변수는 개체이며 개체의 부모입니다. 메소드 호출은 객체입니다. 일반적으로 해당 객체를 기반으로 하는 메소드는 여러 작업을 수행할 수 있습니다. 메소드 호출의 구문에는 함수가 객체를 기반으로 작동한다는 것이 명확하게 명시되어 있습니다
var o = { a: 1, m: function(){ return this; }, n: function(){ this.a = 2; } }; console.log(o.m().a);//1 o.n(); console.log(o.m().a);//2
위 두 줄의 기능이 코드는 정확히 동일하며 둘 다 가상의 개체 REC에서 작동합니다. 첫 번째 줄에서 구문을 호출하는 메서드는 이 함수 실행의 전달자가 ract 개체임을 명확하게 나타냅니다. 함수의 모든 작업은 변수와 달리 이 개체를 기반으로 합니다. 포함됨 중첩된 함수는 이를 호출하는 함수에서 이를 상속하지 않습니다. 중첩된 함수가 메서드로 호출되면 해당 함수의 this 값은 해당 함수를 호출한 개체를 가리킵니다. 중첩된 함수가 함수로 호출되는 경우 this 값은 전역 객체(비엄격 모드)이거나 정의되지 않음(엄격 모드)입니다.
rect.setSize(width,height); setRectSize(rect,width,height);
var o = { m: function(){ function n(){ return this; } return n(); } } console.log(o.m());//window
이 외부 함수의 this 값에 액세스하려면 다음이 필요합니다. 이 값을 변수에 저장하려면 이 변수와 내부 함수가 모두 동일한 범위에 있어야 합니다. 보통 self 또는 this를 저장하는 데 사용되는 변수
var o = { m: function(){ function n(){ 'use strict'; return this; } return n(); } } console.log(o.m());//undefined
【3】생성자 호출 모드
함수나 메서드 호출 앞에 new 키워드가 오면 생성자 호출이 됩니다
var o = { m: function(){ var self = this; console.log(this === o);//true function n(){ console.log(this === o);//false console.log(self === o);//true return self; } return n(); } } console.log(o.m() === o);//true
생성자 호출이 괄호 안에 있으면 실제 매개변수 목록 세트를 포함합니다. 이러한 실제 매개변수 표현식은 먼저 계산된 후 함수에 전달됩니다. 생성자에 형식 매개변수가 없는 경우 JavaScript 생성자 호출 구문에서는 실제 매개변수 목록과 괄호를 생략할 수 있습니다. 정식 매개변수가 없는 모든 생성자 호출은 괄호를 생략할 수 있습니다
function fn(){ this.a = 1; }; var obj = new fn(); console.log(obj.a);//1
[참고] 생성자는 메서드 호출처럼 보이지만 여전히 새 객체를 호출 컨텍스트로 사용합니다. 즉, new o.m() 표현식에서 호출 컨텍스트는 o
function fn(x){ this.a = x; }; var obj = new fn(2); console.log(obj.a);//2
가 아닙니다. 생성자는 일반적으로 return 키워드를 사용하지 않고 일반적으로 새 개체를 초기화하며 생성자의 함수 본문이 실행을 마치면 명시적으로 반환합니다. . 이 경우 생성자 호출 표현식은 이 새 객체의 값으로 평가됩니다.
var o = new Object();//等价于 var o = new Object;
생성자가 return 문을 사용하지만 반환 값을 지정하지 않거나 기본 값을 반환하는 경우 반환 값은 무시되고 사용됩니다. 호출 결과로서의 이 새로운 객체
var o = { m: function(){ return this; } } var obj = new o.m(); console.log(obj,obj === o);//{} false console.log(obj.constructor === o.m);//true
생성자가 객체를 반환하기 위해 명시적으로 return 문을 사용하는 경우 호출 표현식의 값은 이 객체입니다.
function fn(){ this.a = 2; }var test = new fn(); console.log(test);//{a:2}
[4] 간접 호출 모드
JavaScript의 함수도 객체입니다. , 함수 객체에는 메소드도 포함될 수 있습니다. call() 및 apply() 메서드를 사용하면 함수를 간접적으로 호출할 수 있습니다.
두 메서드 모두 호출에 필요한 this 값을 명시적으로 지정할 수 있습니다. 즉, 모든 함수는 모든 개체의 메서드로 호출될 수 있습니다. 이 함수조차도 해당 객체의 메서드가 아닙니다. 두 방법 모두 호출의 실제 매개변수를 지정할 수 있습니다. call() 메소드는 자신의 실제 매개변수 목록을 함수의 실제 매개변수로 사용하는 반면, apply() 메소드는 매개변수를 배열 형식으로 전달해야 합니다
function fn(){ this.a = 2; return; } var test = new fn(); console.log(test);//{a:2}
위 내용은 자바스크립트 기본 튜토리얼의 함수 호출 패턴 예시 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!