이 기사에서는 JavaScript의 다양한 일반적인 기능 정의 방법을 자세하게 설명하며 참조를 위해 귀하와 공유됩니다. 특정 분석은 다음과 같습니다.
먼저 JavaScript에서 가장 일반적인 4 가지 기능 정의를 살펴 보겠습니다.
함수 생성자로 정의 된 함수는 다음과 같습니다.
var multive = new 함수 ( 'x', 'y', 'return x * y;');
함수 선언,이 방법은 가장 일반적입니다.
함수 곱하기 (x, y) {return x * y;}익명 함수로 선언 된 다음 변수에 할당 된 함수 표현식은 매우 일반적인 방법입니다.
var multiply = function (x, y) {return x * y;}함수 표현식이지만 함수 선언은 명명 된 함수이며 값을 변수에 할당했습니다.
var multiply = function multi (x, y) {return x * y;}먼저 함수 이름과 함수에 지정된 함수 변수 간의 직접적인 관계를 비교해 봅시다. 예제 4에서 더 직관적이기는 것은 정말 조금 더 직관적입니다. 이제는 기능 변수 곱셈과 기능 이름 Multi의 관계입니다.
반대로 함수 이름을 수정할 수는 없습니다. 반대로 함수 변수는 재 할당 할 수 있습니다. 함수 변수를 재 할 수 있다는 것을 이해하기 쉽습니다. 우리의 네 번째 예에서, 방금 정의 된 Multiply 변수는 다음과 같이보고 재 할당하는 것이 즐겁지 않습니다.
multiply = function (x, y) {return x + y;}나는 즉시 곱셈에서 추가로 자신을 변형시켰다. 그러나 다중 기능 변수를 변경하는 것은 불가능합니다. 함수 정의는 이미 있습니다. 여전히 참조를 유지하는 한 변경되지 않습니다. 여기서 이해하기 쉽지 않을 수 있습니다. 이것에 대해 먼저 생각하고 내려다 보면 천천히 이해할 수 있어야합니다.
함수 이름은 동시에 함수 외부에서 사용할 수 없으며 기능 본문 내부에서만 볼 수 있습니다. 매우 간단한 예 :
var foo = function bar () {alert ( 'hello');} foo (); // 프롬프트 "hello"문자열 bar (); // 오류를 실행하면 막대가 정의되지 않습니다그리고 분명히, 여기의 막대는 실제로 함수 이름이지만 실제로는 외부에서 호출 될 수 없습니다. 현재이 예제 4와 마찬가지로 왜이 예제가 여전히 그렇게 잘 행동하는지 묻는 어린이 신발이있을 것입니다. 예제 2의 방법을 사용하지 않는 이유는 무엇입니까? 좋은 질문, 천천히 분해하겠습니다.
예제 4를 계속하면 기능 이름 (멀티) 및 함수 변수 (곱하기)가 동일하지 않지만 실제로는 전혀 관계가 없으므로 일관성을 유지할 필요가 없습니다. 이에 대해 말하면, 위의 네 가지 예는 3으로 줄여야하며 예제 2와 예제 4는 본질적으로 일관성이 있어야한다고 생각합니다. 뭐, 믿지 않니? hehe, 나는 그것을 침묵 속에 유지해야한다 ~ 계속 읽기 ~~
예제 2 및 예제 4와 비교하여 VAR 함수 변수는 적고 예제 3과 비교하여 해당 함수 이름은 적습니다. 현상의 관점에서, 예 2와 예 4의 본질은 동일하며 증거는 다음과 같습니다.
함수 foo () {} alert (foo); // "foo"var bar = foo; alert (bar)를 포함하는 함수 이름을 프롬프트합니다. // 함수 이름은 여전히 "foo"만 포함하고 Bar와 관련이 없습니다.실제로 철제입니까? 예제 4의 코드와 함께 예제 2와 유사한 위 코드를 작성하는 방법입니까? 맞습니다. 이것은 내가 방금 말한 것입니다. 두 사람은 본질적으로 동일해야합니다. 그러나 사례 2에서 함수를 정의 할 때 JS 엔진은 기능 이름이 곱하는 함수를 선언하고 Multiply라는 변수를 조용히 정의한 다음이 변수에 따라 정확히 동일한 이름으로 할당하는 등 무언가를 수행하는 데 도움이되었습니다. 우리는 함수 이름을 곱하는데 실제로 함수 변수를 곱하는 것을 사용하고 있었기 때문에 현기증이 됐습니다 ~ 솔직히 말해서, 우리가 호출했을 때 실제로 기능 변수를 호출했을 때 기능을 외부로 호출 할 수 없었기 때문에 위의 언어를 가졌습니다.
그러나 여기서 언급 할 작은 차이점은 함수 선언 메소드에 의해 정의 된 함수가 생성자 선언 또는 함수 표현 선언과 다르다는 것입니다. 함수 선언 메소드는 함수 정의 전에 호출 될 수 있다는 것입니다. 언급하지 말고 코드를보십시오.
foo (); // tip foofunction foo () {alert ( 'foo');} bar (); // 버디, 위의 것과 실제로 다르므로 과시하지 마십시오. 이것이 실수가 아닌가? 프롬프트 막대는 정의되지 않습니다 var bar = function () {alert ( 'bar');}생성자가 선언 한 기능에 대해 이야기 해 봅시다. 선언 된 함수는 현재 선언 된 위치의 범위를 상속하지 않습니다. 기본적으로 만 글로벌 범위를 갖습니다. 그러나 이것은 다음과 같이 다른 기능 선언 방법에서 동일합니다.
함수 foo () {var hi = 'hello'; // return function () {// alert (hi); //}; return function ( 'return hi;');} foo () (); // 실행 효과는 실행하고 직접 만나십시오.생성자 선언을 사용하여 반환 된 함수의 실행은 변수 HI가 그 범위 (즉, 글로벌 범위)에 있지 않기 때문에 필연적으로 오류를보고 할 것이라고 상상할 수 있습니다.
또 다른 요점은 사람들이 종종 생성자 모드에서 선언 된 기능이 비효율적이라고 말합니다. 이게 왜? 오늘, 나는 문서에서 다른 세 가지 방법으로 선언 된 기능이 한 번만 구문 분석 될 것이라는 것을 알게되었습니다. 실제로, 그것들은 폐쇄에 존재하지만, 그것은 스코프 체인과 관련이 있으며, 기능 본문은 한 번만 구문 분석됩니다. 그러나 생성자 방법은 함수가 실행될 때마다 함수 본문이 한 번 구문 분석된다는 것입니다. 이러한 방식으로 선언 된 함수는 매개 변수와 기능 본문을 저장하는 객체라고 생각할 수 있습니다. 실행 될 때마다 한 번 구문 분석해야하며 매개 변수와 기능 본체가 실행되며 필연적으로 비효율적입니다. 특정 실험을 수행하는 방법을 모르십니까?
마지막으로, 아무도주의를 기울이지 않는 것에 대해 이야기합시다. 기능 선언의 방식이 기능의 방식이 아닌 것처럼 보이나요?
그것이 표현의 일부가되면, 그것은 예 3 및 예제 4와 같습니다.
더 이상 스크립트 자체 또는 함수의 "소스 요소"가 아닙니다. 소스 요소는 무엇입니까? 즉, 스크립트의 비 네스트 진술 또는 다음과 같은 기능 본문입니다.
var x = 0; // 소스 요소 if (x == 0) {// 소스 요소 x = 10; // 소스 요소가 아닙니다. if 문장에 중첩되어 있기 때문에 boo () {} // 소스 요소가 아닙니다. if 문에 중첩되어 있기 때문에} 함수 foo () {// 소스 요소 var y = 20; // 소스 요소 함수 bar () {} // 소스 요소 while (y == 10) {// 소스 요소 함수 blah () {} // 소스 요소가 아니 었습니다. // 소스 요소가 아닙니다.나는 소스 요소의 개념을 대략 이해했다. 방금 언급 한 기능 선언을 계속할 것입니다. 참조하십시오 :
// 함수 선언 함수 foo () {} // 함수 expression (함수 bar () {}) // function expression x = function hello () {} if (x) {// function expression function world () {}} // 함수 명령문 a () {// function state function b () {) {// function expunction c () {}}}마지막으로, 내 이해에 대해 이야기하겠습니다. 함수 선언과 비 기능 선언을 구별하는 이유는 내 관점에서 JS 구문 분석 엔진이 실행할 때 기능 선언 방법의 기능 정의가 미리 선언되기 때문입니다. 즉, 우리가 위에서 방금 말했듯이 함수 정의 전에 사용할 수 있습니다. 실제로, 구문 분석 엔진은 우리가 그것을 사용하기 전에 그것을 구문 분석했습니다. 그러나 표현 함수 선언과 같은 비 기능 선언은 JS 구문 분석 엔진과 같이 VAR에 의해 선언 된 변수 만 사전에 정의합니다. 현재 변수 값은 정의되지 않으며이 변수에 대한 실제 할당은 코드의 실제 위치에 있습니다. 따라서 위에서 언급 한 오류는 모두 정의되지 않았습니다. 실제 변수는 정의되었지만 아직 할당되지 않았습니다. JS 구문 분석 엔진은 기능이라는 것을 알지 못합니다.
이 기사의 설명에는 모든 사람의 JavaScript 웹 프로그래밍 디자인에 대한 특정 참조 값이 있다고 생각합니다.