JavaScript에서 함수를 작성하는 두 가지 주요 방법 인 기능 선언 및 기능 표현이 있습니다. 두 방법 모두 다른 해당 시나리오가 있습니다. 이 노트는 주로 기능 표현식의 몇 가지 주요 특성과 아래에 설명 된 사용 시나리오에 중점을 둡니다.
주요 기능
• 선택적 기능 이름
함수 이름은 함수 선언의 필수 부분입니다. 이 기능 이름은 변수와 같습니다. 새로 정의 된 함수는이 변수에 복사됩니다. 기능에 대한 호출은 향후이 변수를 통해 수행해야합니다. 함수 표현식의 경우 함수 이름은 예를 들어 다음과 같습니다.
var sub = function (a1, a2) {return a1-a2; }이 예에서 함수 표현식은 이름이 없으며 익명 함수 표현식에 속합니다. 다음 예를 살펴 보겠습니다.
var sub = function f (a1, a2) {return a1-a2; } console.log (f (5,3)); // 잘못된 호출 메소드 console.log (sub (5,3)); // 호출 방법을 올바르게합니다이 예에서 함수 표현식의 이름은 f입니다. 이 이름 F는 실제로 함수 내부의 로컬 변수가되고 함수 객체 자체를 나타냅니다. 기능이 재귀 할 때 크게 사용되며 나중에 자세히 설명합니다.
• 실행 단계에서 생성 (함수 선언과 다름)
이 기능은 함수 표현식이 함수 선언과 분명히 다르다는 것입니다.
통역사는 JavaScript 코드를 구문 분석 할 때 두 방법을 동일하게 처리하지 않습니다. 통역사는 먼저 함수 선언을 읽고 코드를 실행하기 전에 사용할 수있게합니다. 함수 표현식의 경우 통역사가 실제로 구문 분석 및 실행되기 전에 해석 된 코드 라인으로 실행될 때까지 기다려야합니다. 예를 들어:
Console.log (Add (1,2)); // "3"console.log (sub (5,3)); // "예기치 않은 식별자", 오류 함수 add (a1, a2) {return a1+a2; } var sub = function (a1, a2) {return a1-a2; }첫 번째 진술은 정상적으로 실행될 수 있습니다. 코드를 평가할 때 JavaScript 엔진은 첫 번째 패스에서 기능을 선언하고 기능 선언 프로모션이라는 프로세스를 통해 소스 트리 상단에 배치합니다. 즉, 실행 환경의 생성 단계 (함수는 호출되지만 실행을 시작하지 않음) 동안 함수 선언은 "호스팅"이됩니다. 따라서 함수를 선언하는 코드가 함수를 호출하는 코드 뒤에 있더라도 JavaScript 엔진은 함수 선언을 상단으로 끌어 올립니다. 그러나 함수 선언이 함수 표현식으로 변경되면 실행 중에 오류 가보고됩니다. 그 이유는 함수가있는 문을 실행하기 전에 변수 하위에 함수에 대한 참조가 포함되지 않기 때문입니다. 즉, 변수 하위는 코드 실행 단계에서 할당됩니다. 위의 차이를 제외하고, 다른 측면에서, 함수 선언 및 함수 표현의 구문은 동일하다.
• 가변 객체에 영향을 미치지 마십시오
var sub = function f (a1, a2) {console.log (typeof f); // "function"return a1-a2; } console.log (typeof f); // "Uncaught ReferenceError : F는 정의되지 않았습니다 (…)"위의 예에서, 우리는 함수 이름 f가 함수 객체 내에서만 사용할 수 있고 함수 표현식의 함수 이름이 변수 객체에 존재하지 않음을 알 수 있습니다.
시나리오를 사용하십시오
기능 표현에 대한 많은 사용 시나리오가 있습니다. 다음은 주로 기능 재귀 및 코드 모듈성의 응용에 대해 설명합니다.
• 기능 재귀
다음 예를 참조하십시오.
함수 계승 (num) {if (num <= 1) {return 1; } else {return num * factorial (num -1); }}이것은 고전적인 요인 기능이지만이 예제의 한 가지 문제는 기능 이름 Factorial이 기능 본문과 밀접하게 연결되어 있다는 것입니다. 다음 진술을 실행하면 오류가 발생합니다.
var exerfactorial = factorial; factorial = null; Console.log (또 다른 factactorial (5)); // "Uncaught TypeError : Factorial은 함수가 아닙니다"
오류의 이유는 기능 본문 내부에서 Factorial 함수가 호출되고 가변 요인에 의한 함수에 대한 참조가 취소되었으므로 오류 가보고되기 때문입니다. 이 상황에 대한 해결책은 일반적으로 arguments.callee를 사용하여 해결할 수 있습니다.
함수 계승 (num) {if (num <= 1) {return 1; } else {return num * arguments.callee (num -1); }}이런 식으로, 여기서 다른 기능을 실행하여 올바른 결과를 얻을 수 있습니다. 그러나 엄격한 모드 "엄격한"에서는 arguments.callee에 스크립트를 통해 액세스 할 수 없습니다. 예를 들어 기능 표현식을 사용 하여이 문제를 해결하는 방법입니다.
var factorial = (함수 f (num) {if (num <= 1) {return 1;} else {return num * f (num -1);}}); Console.log (Factorial (5)); // "120"• 코드 모듈성
JavaScript에는 블록 레벨 범위가 없지만 기능 표현을 사용하여 JavaScript 코드를 모듈화 할 수 있습니다. 모듈 식 코드는 사용자에게 알려질 필요가없는 세부 사항을 캡슐화하고 다음과 같은 글로벌 환경에 대한 오염을 피하면서 사용자의 관련 인터페이스에만 노출 될 수 있습니다.
var person = (function () {var _name = ""; return {getName : function () {return _name;}, setName : function (newName) {_name = newName;}};} (); person.setName ( "John"); person.getName (); //"남자"이 예에서는 익명 함수 표현식이 생성되며, 여기에는 모듈의 개인 변수 및 함수가 포함되어 있습니다. 이 함수 표현식의 실행 결과는 모듈에 의해 노출 된 공개 인터페이스를 포함하는 객체를 반환합니다. 코드 모듈성에는 여러 가지 형태가 있습니다. 예를 들어, 일반적으로 사용되는 일부 JavaScript 라이브러리에서 다음 예제와 유사한 즉각적인 실행 기능이 일반적으로 사용됩니다.
(function () {var _name = ""; var root = this; var person = {getName : function () {return _name;}, setName : function (newName) {_name = newName;}}; root.person = person;} .call (this)); person.setName ( "John"); person.getName (); //"남자"이 메소드는 모듈의 공개 인터페이스를 포함하는 객체를 글로벌 오브젝트의 속성으로 직접 사용하여 전역 객체의 속성을 다른 곳에서 사용할 수 있습니다.
위의 Cliché JavaScript 함수 표현식은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.