>  기사  >  웹 프론트엔드  >  JavaScript의 함수 정의 및 선언과 표현식의 차이점에 대한 자세한 설명

JavaScript의 함수 정의 및 선언과 표현식의 차이점에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-07-21 13:48:461586검색

js에서 함수는 실제로 객체입니다. 각 함수는 Function 유형의 인스턴스이며 다른 참조 유형과 마찬가지로 속성과 메서드를 갖습니다. 따라서 함수 이름은 실제로 함수 개체에 대한 포인터이며 특정 함수에 바인딩되지 않습니다. 두 가지 일반적인 정의 방법(아래 참조) 외에도 이 개념을 보다 직관적으로 반영할 수 있는 또 다른 정의 방법이 있습니다.


var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐

Function의 생성자는 여러 매개변수를 받을 수 있지만 마지막 매개변수는 다음과 같습니다. 항상 함수 본체로 간주됩니다. 이 방법의 한 가지 단점은 코드가 두 번 구문 분석된다는 것입니다. 첫 번째는 기본 ES 코드를 구문 분석하고 두 번째는 생성자에 전달된 문자열을 구문 분석하는 것입니다. 이로 인해 성능이 저하됩니다. . 여기에 작성하세요. js의 함수가 실제로 객체라는 개념을 이해하는 데 도움이 됩니다.

  (1) js 함수에는 오버로딩의 개념이 없습니다.

오버로딩의 개념을 자바에서 오버로딩이 구현되는 방식과 비교해 보겠습니다. 자바에서는 메소드가 자신의 메소드를 통해 메소드를 고유하게 식별합니다. 서명. . 메소드 서명에는 메소드 이름, 매개변수 수, 매개변수 순서 및 매개변수 유형이 포함됩니다. 따라서 두 메서드의 메서드 이름은 동일하지만 다른 시그니처 요소가 다른 경우 컴파일러는 이를 두 개의 다른 메서드로 간주하여 동일한 이름을 가진 다른 메서드가 존재할 수 있도록 하여 오버로드 개념을 실현합니다. (인용문: js에 오버로딩이 없는 이유를 깊이 이해하는 방법 - 세그먼트 오류에 대한 manxisuo의 답변).

  위에서 말했듯이 js의 함수 이름은 실제로 함수 개체에 대한 포인터입니다. 따라서 함수 이름은 함수의 고유 식별자라고 할 수 있으며 매개변수 목록과는 아무 관련이 없습니다. 동일한 이름을 가진 두 개의 이름이 있어서는 안 됩니다. 함수(포인터는 동시에 하나의 개체만 가리킬 수 있기 때문)에는 오버로딩이라는 개념이 없습니다. 예를 들면:


function sum(num1, num2){
return num1 + num2;
}
function sum(num1, num2, num3){
return num1 + num2 + num3;
}

위의 내용은 다른 방식으로 작성할 수 있으며 더 직관적입니다.


var sum = function(num1, num2){
return num1 + num2;
}
sum = function(num1, num2, num3){
return num1 + num2 + num3;
}

위의 줄은 함수(num1,num2)의 합을 가리킨다는 것이 분명합니다. 함수(num1, num2, num3)에 합을 추가하면 두 번째 포인터가 첫 번째 포인터를 덮어쓰게 됩니다. 따라서 js에는 오버로드라는 개념이 없다는 것이 더 분명해집니다.

(2) 함수 선언과 함수 표현식의 차이점

우리는 함수를 정의하는 데 일반적으로 사용되는 두 가지 방법, 즉 함수 선언과 함수 표현식이 있다는 것을 알고 있습니다.

Function 선언은 다음 예에서 볼 수 있듯이 가장 일반적인 정의 방법이라고 할 수 있습니다.


function sum(num1, num2){
return num1 + num2;
}

Function 표현식, 이 정의 방법은 클로저 및 일반적인 $scope와 같은 일부 프레임워크에서 자주 사용됩니다. angular.doSomething = function(){...}:


sum = function(num1, num2){
return num1 + num2;
};

위의 두 가지 정의 방법은 거의 동일하지만 약간의 차이가 있습니다. 다음 예를 참조하세요.


//函数声明
alert(sum(100, 100));
function sum(num1, num2){
return num1 + num2;
}
//函数表达式
alert(sum(100, 100));
var sum = function(num1, num2){
return num1 + num2;
};

이 두 코드 조각은 크게 달라 보이지는 않지만 함수가 정의되는 방식만 다릅니다. 그러나 사실 첫 번째 문단은 잘 작동하지만 두 번째 문단에서는 오류가 발생합니다. 이는 코드가 실행되기 전에 파서가 이미 함수 선언 호이스팅이라는 과정을 통해 함수 선언을 읽어 실행 환경에 추가해 놓았기 때문입니다. 간단히 말해서 파서는 소스 트리의 맨 위에 함수 선언을 먼저 배치합니다. 아래 코드에서 함수는 초기화 문에 있습니다(맨 위로 올라오지 않음). 간단히 말해서 할당 문을 실행하기 전에 sum은 어떤 함수도 가리키지 않으므로 이전에 함수를 호출하면 오류가 보고됩니다.

위 내용은 JavaScript의 함수 정의 및 선언과 표현식의 차이점에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.