기능 정의 및 호출
기능 정의. JavaScript에서는 함수를 정의하는 방법은 다음과 같습니다.
함수 abs (x) {if (x> = 0) {return x;} else {return -x;}}위의 ABS () 함수는 다음과 같이 정의됩니다.
함수는 이것이 함수 정의임을 나타냅니다.
ABS는 함수의 이름입니다.
(x) 여러 매개 변수로 분리 된 괄호 안에 함수의 매개 변수를 나열합니다.
{...} 사이의 코드는 기능 본문이며, 여러 진술을 포함 할 수 있거나 심지어 어떤 진술도 없을 수도 있습니다.
참고 : 기능 본체 내부의 명령문이 실행되면, 일단 반환하기 위해 실행되면 함수가 실행되고 결과가 반환됩니다. 따라서 내부 결정 및 루프는 매우 복잡하게 구현 될 수 있습니다.
반환 문이 없으면 함수가 실행 된 후 결과가 반환되지만 결과는 정의되지 않습니다.
JavaScript의 함수는 객체이기 때문에 위에서 정의 된 abs () 함수는 실제로 함수 객체이며 함수 이름 abs는 함수를 가리키는 변수로 간주 될 수 있습니다.
var abs = function (x) {if (x> = 0) {return x;} else {return -x;}}이런 식으로 함수 (x) {...}는 함수 이름이없는 익명 함수입니다. 그러나이 익명 함수는 가변 ABS에 할당되므로 변수 ABS를 통해 함수를 호출 할 수 있습니다.
두 정의는 완전히 동일합니다. 두 번째 방법은 전체 구문에 따라 기능 본문 끝에 하나를 추가해야하며, 이는 할당 문이 종료되었음을 나타냅니다.
함수를 호출 할 때 순서대로 매개 변수를 전달합니다.
ABS (10); // 반환 10
ABS (-9); // 9로 돌아갑니다
JavaScript는 영향을받지 않고 매개 변수를 전달할 수 있으므로 정의 된 매개 변수보다 더 많은 매개 변수가 전달되었다는 데는 문제가 없지만 이러한 매개 변수는 함수 내에서 필요하지 않습니다.
ABS (10, 'Blablabla'); // 반환 10
ABS (-9, 'haha', 'hehe', null) // 9로 돌아갑니다
정의 된 것보다 더 적은 매개 변수에는 문제가 없습니다
abs (); 반환 난
현재 ABS (x) 함수의 매개 변수 X는 정의되지 않은 수신되고 계산 결과는 NAN입니다.
function abs (x) {if (typeof x! == 'number') {trash 'not a number':} if (x> = 0) {return x;} else {return -x;}}논쟁
JavaScript에는 또한 무료 키워드 인수가 있으며, 이는 함수 내부에서만 작동하며 항상 현재 함수의 발신자가 전달한 모든 매개 변수를 가리 킵니다.
함수 foo (x) {alert (x); // 10for (var i = 0; i <arguments.length; ++) {alert (arguments [i]); // 10,20,30}} foo (10.20,30)인수를 사용하면 발신자가 전달하는 모든 매개 변수를 얻을 수 있습니다. 즉, 함수가 매개 변수를 정의하지 않더라도 매개 변수의 값을 여전히 얻을 수 있습니다.
함수 abs () {if (arguments.length === 0) {return 0;} var x = arguments [0] return x> = 0? x : -x;} abs (); // 0ABS (10); // 10abs (-9) // 9실제로, 인수는 들어오는 매개 변수의 수를 결정하는 데 가장 일반적으로 사용됩니다. 이 글을 볼 수 있습니다.
// foo (a [, b], c)
// 2 ~ 3 매개 변수를 허용하고 B는 선택적 매개 변수입니다. 두 개의 매개 변수 만 입력 및 종료되면 B는 기본적으로 NULL입니다.
함수 foo (a, b, c) {if (arguments.length === 2) {// 획득 한 실제 매개 변수는 a이고 bc는 undefinedc = b; b = null입니다. // b는 기본값이됩니다중간 매개 변수 B를 "선택적"매개 변수로 변경하려면 인수를 통해서만 판단 한 다음 매개 변수를 읽고 값을 할당 할 수 있습니다.
REST 매개 변수
JavaScript 함수는 매개 변수를받을 수 있으므로 문제가 발생할 때 모든 매개 변수를 얻기 위해 인수를 사용해야합니다.
함수 (a, b) {var i, rest = []; if (arguments.length> 2) {for (i = 2; i <arguments.length; i ++) {rest.push (arguments [i]);}} console.log ( 'a =' + a); console.log ( 'b =' + b); log (rest);}정의 된 매개 변수 A 및 B 이외의 매개 변수를 얻으려면 인수를 사용해야하며 루프는 인덱스 2에서 시작하여 처음 두 매개 변수를 제외합니다. 이 글쓰기 방법은 추가 휴식 매개 변수를 얻기 위해 어색합니다. 더 좋은 방법이 있습니까?
ES6 표준은 나머지 매개 변수를 소개하고 위의 함수는 다음과 같이 다시 작성할 수 있습니다.
함수 foo (a, b, ... rest) {console.log ( 'a =' + a); console.log ( 'b =' + b); console.log (rest);} foo (1,2,3,4,5); // 결과 // a = 1 // b = 2 // 배열 [3,4,5] foo (1) //나머지 매개 변수는 끝에서만 작성할 수 있으며 실행 결과에서 표시됩니다. 작업 결과에서 전달 된 매개 변수가 A, B에 바인딩되고 추가 매개 변수가 배열의 변수 REST로 넘겨 져 있음을 알 수 있습니다.
인수가 필요하지 않고 모든 매개 변수를 얻습니다.
전달 된 매개 변수에 정상 정의 된 매개 변수로 채워지지 않으면 중요하지 않으면 나머지 매개 변수는 빈 배열을받습니다 (정의되지 않았 음).
반환 명세서
우리는 앞에서 JavaScript 엔진에 라인 끝에 세미콜론을 자동으로 추가하는 메커니즘이 있다고 언급하여 반품 문에서 큰 구덩이에 빠질 수 있습니다.
function foo () {return {name : 'foo'};} foo (); // {이름 : 'foo'}메모:
function foo () {return : // 세미콜론이 자동으로 추가되었으며, 이는 정의되지 않은 {name : 'foo'}; //이 명령문은 더 이상 실행할 수 없습니다. }따라서 여러 줄을 작성하는 올바른 방법은입니다
function foo () {return {// 세미콜론은 여기에 자동으로 추가되지 않습니다. 이름 : 'foo'}}가변 범위
JavaScript에서 VAR로 선언 된 것은 실제로 범위를 지정합니다.
기능 본문 내부에서 변수가 선언되면 변수의 범위는 전체 기능 본체이며 변수는 기능 본문 외부에서 참조해서는 안됩니다.
'strict': function foo () {var x = 1; x = x +1;} x = x +2; // RELCERROR는 함수 외부의 변수 X를 참조 할 수 없습니다.서로 다른 두 가지 함수가 각각 동일한 변수를 선언하는 경우 변수는 해당 기능의 본문 내에서만 작동합니다. 다시 말해, 다른 함수 내에서 동일한 이름을 가진 변수는 서로 독립적이며 서로 영향을 미치지 않습니다.
'struct': function foo () {var x = 1; x = x +1;} function bar () {var x = 'a'; x = x + 'b';}JavaScript 함수가 중첩 될 수 있으므로 내부 기능은 외부 함수로 정의 된 변수에 액세스 할 수 있으며 다른 방법은 다음과 같습니다.
'strict'; function foo () {var x = 1; function bar () {var x = 1; function bar () {var y = x +1; // bar는 foo z = y + 1의 변수 x에 액세스 할 수 있습니다. // referenceError! Foo는 변수의 변수에 액세스 할 수 없습니다! }}내부 및 외부 함수의 변수 이름이 두 배가되면 어떻게됩니까?
'strict': function foo () {var x = 1; function bar () {var x = 'a'; alert ( 'x in bar () =' + x); // 'a'} alert ( 'x in foo () =' + x) // 1bar ();}가변 향상
JavaScript의 함수 정의는 먼저 전체 기능 본문 명령문을 스캔하고 모든 선언 된 모든 변수를 함수의 맨 위에 "업그레이드"합니다.
'Strict'; funture foo () {var x = 'hello,'+y; alert (x); var y = 'bob';} foo ();위의 foo () 함수의 경우 JavaScript 엔진에서 보이는 코드는 다음과 같습니다.
함수 foo () {var y; // 변수 y = 'hello' + y; alert (x); y = 'bob';}의 var x를 올립니다.JavaScript 의이 이상한 "특성"으로 인해 함수 내부의 변수를 정의 할 때 규칙을 엄격히 준수하여 "함수 내에서 모든 변수를 먼저 선언"하십시오. 가장 일반적인 방법은 VAR을 사용하여 기능에 내부적으로 사용되는 모든 변수를 선언하는 것입니다.
함수 foo () {var x = 1, // x는 1y = x +1로 초기화되고 // y는 2z, i로 초기화됩니다. // z와 나는 정의되지 않은 // 다른 문장 (i = 0; i <100; i ++) {...}}글로벌 범위
어떤 함수에서 정의되지 않은 변수에는 전역 범위가 있습니다. 실제로 JavaScript는 기본적으로 창의 속성에 묶인 전역 스코프 변수를 가지고 있습니다.
'strict'; var source = 'javaScript를 배우십시오'; Alert (코스); // 'JavaScript를 배우십시오'; Alert (Window.course); // 'JavaScript 배우기'
네임 스페이스
글로벌 변수는 창에 바인딩됩니다. 다른 javaScript 파일은 동일한 글로벌 변수를 사용하거나 동일한 이름의 최상위 함수를 가지므로
이름 지정 갈등이 있으며 감지하기가 어렵습니다.
충돌을 줄이는 한 가지 방법은 모든 변수와 함수를 글로벌 변수에 바인딩하는 것입니다.
// 유일한 quju 변수 myappvar myapp = {}; // 기타 변수 : myapp.name = 'myapp'; myapp.version = 1.0; // 기타 함수 myapp.foo = function () {return 'foo';};모든 코드를 고유 한 네임 스페이스 MyApp에 넣으면 글로벌 변수 충돌의 가능성이 크게 줄어 듭니다.
로컬 범위
JavaScript의 변수 범위는 실제로 함수 내부에 있으므로 루프와 같은 문장 블록에서 정의 할 수없는 변수를 정의 할 수 없습니다.
함수 foo () {for (var i = 0; i <100; i ++) {//} i+= 100; // 변수는 여전히 참조 될 수 있습니다.}블록 레벨 범위를 해결하기 위해 ES6은 새로운 키워드 LET를 도입했으며 VAR 대신 블록 수준 스코프 변수를 선언 할 수 있습니다.
함수 foo () {var sum = 0; for (i = 0; i <100; i ++) {sum += i;} i += 1;}끊임없는
VAR과 LET DECLARE 변수이므로 상수를 선언하려면 ES6 전에 작동하지 않습니다. 우리는 보통 모든 자본 변수를 사용하여 이것이 상수임을 나타냅니다.
그 가치를 수정하지 마십시오.
var pi = 3.14;
ES6 표준은 상수를 정의하기 위해 새로운 키워드 Const를 소개합니다.
const pi = 3.14;
pi = 3; // 일부 브라우저는 오류를보고하지 않지만 효과가 없습니다.
pi; // 3.14
위의 JavaScript 기본 함수 _in-depth 분석은 변수 및 범위의 분석은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.