이전 단어
JavaScript 함수의 매개 변수는 대부분의 다른 언어의 함수와 다릅니다. 함수는 얼마나 많은 매개 변수가 전달되는지 신경 쓰지 않으며, 전달 된 매개 변수의 데이터 유형에 관심이 없으며 매개 변수를 전달할 수도 없습니다.
논쟁
JavaScript의 함수 정의는 함수 매개 변수의 유형을 지정하지 않으며 함수 호출은 전달 된 매개 변수 값에 대한 유형 확인을 수행하지 않습니다. 실제로 JavaScript 함수 호출은 들어오는 공식 매개 변수의 수를 확인하지 않습니다.
함수 추가 (x) {return x+1;} console.log (add (1)); // 2console.log (add ( '1')); // '11'console.log (add ()); // nanconsole.log (1,2)); // 2같은 이름의 공식 매개 변수
비 스트릭 모드에서는 동일한 이름의 공식 매개 변수가 함수에 나타날 수 있으며 표시되는 이름의 마지막 공식 매개 변수 만 액세스 할 수 있습니다.
함수 추가 (x, x, x) {return x;} console.log (add (1,2,3)); // 3엄격한 모드에서는 구문 오류에 동일한 이름이 관련 될 때 구문 오류가 발생합니다.
함수 추가 (x, x, x) { 'strict'; return x;} console.log (add (1,2,3)); // syntaxerror :이 맥락에서 허용되지 않음매개 변수 수
실제 참조 함수로 선언 된 지정된 공식 매개 변수가 작을 때 나머지 공식 매개 변수는 정의되지 않은 값으로 설정됩니다.
함수 추가 (x, y) {console.log (x, y); // 1 undefined} add (1);로직 또는 연산자를 자주 사용하여 생략 된 매개 변수에 대한 합리적인 기본값을 설정합니다.
함수 추가 (x, y) {y = y || 2; console.log (x, y); // 1 2} 추가 (1);[참고] 실제로 y ||를 사용합니다 2는 엄격하지 않으며 명시 적으로 잘못된 값을 설정하지 않습니다 (정의되지 않은, null, false, 0, -0, ', nan)도 동일한 결과를 얻습니다. 따라서 실제 시나리오를 기반으로 합리적으로 설정해야합니다.
많은 실제 주장이있을 때, 나머지 실제 주장은 직접 얻을 수 없습니다. 곧 언급 된 인수 객체를 사용해야합니다.
JavaScript의 매개 변수는 내부적으로 배열로 표시됩니다. 함수는 항상이 배열을 수신하며 어레이에 어떤 매개 변수가 포함되어 있는지 신경 쓰지 않습니다. 이 매개 변수 배열은 함수 본문의 인수 객체를 통해 액세스 할 수 있으므로 함수로 전달되는 각 매개 변수를 얻습니다. 인수 객체는 배열 인스턴스가 아니며 제곱 브래킷 구문을 사용하여 모든 요소에 액세스 할 수있는 배열 객체입니다.
함수 add (x) {console.log (인수 [0], 인수 [1], 인수 [2]) // 1 2 3 3 return x+1;} add (1,2,3);인수 객체의 길이 속성은 실제 매개 변수의 수를 보여주고 함수의 길이 속성은 공식 매개 변수의 수를 보여줍니다.
함수 추가 (x, y) {console.log (arguments.length) // 3return x+1;} add (1,2,3); console.log (add.length); // 2공식 매개 변수는 편리하지만 필요하지 않습니다
함수 add () {반환 인수 [0] + 인수 [1];} console.log (add (1,2)); // 3객체 매개 변수
함수에 3 개 이상의 공식 매개 변수가 포함 된 경우, 기능의 실제 매개 변수의 올바른 순서가 호출된다는 것을 기억하는 것은 실제로 두통입니다.
함수 ArrayCopy (/*array*/from,/*index*/form_start,/*array*/to,/*index*/to_start,/*integer*/length) {// todo}이름/값 쌍의 형태로 매개 변수를 전달하므로 매개 변수의 순서는 관련이 없습니다. 함수를 정의 할 때 전달 된 실제 매개 변수는 별도의 객체에 기록됩니다. 호출 할 때 물체가 전달됩니다. 객체의 이름/값 쌍은 실제로 필요한 실제 매개 변수 데이터입니다.
함수 EasyCopy (Args) {ArrayCopy (ArrayCopy, args.form_start || 0, args.to, args.to_start || 0, args.length);} var a = [1,2,3,4], b = []; EasyCopy ({form : a, to : b, length : 4});동기
동일한 모양으로 참여하는 양식의 실제 매개 변수 수가 인수 객체의 값과 해당 공식 매개 변수의 값은 동기화 된 상태로 유지됩니다.
함수 테스트 (num1, num2) {console.log (num1, arguments [0]); // 1 arguments [0] = 2; console.log (num1, 인수 [0]); // 2num1 = 10; console.log (num1, argument [0]); // 10 10} test (1);[참고] 명명 된 매개 변수와 해당 인수 객체의 값은 동일하지만 동일한 네임 스페이스는 아닙니다. 네임 스페이스는 독립적이지만 값은 동기입니다
그러나 엄격한 모드에서는 인수 객체의 값과 공식 매개 변수의 값이 독립적입니다.
함수 테스트 (num1, num2) { 'strict'; console.log (num1, arguments [0]); // 1 arguments [0] = 2; console.log (num1, arguments [0]); // 1 2num1 = 10; console.log (Argument [0]); // 10 2} test (1);공식 매개 변수에 해당 실제 매개 변수가 없으면 인수 객체의 값은 공식 매개 변수의 값에 해당하지 않습니다.
함수 테스트 (num1, num2) {console.log (num1, arguments [0]); // undefined, undefinednum1 = 10; arguments [0] = 5; console.log (num1, arguments [0]); // 10,5} test ();내부 속성
Callee e
인수 객체에는 Callee라는 속성이 있으며, 이는 인수 객체를 소유 한 함수에 대한 포인터입니다.
아래는 고전적인 요인 기능입니다
함수 계승 (num) {if (num <= 1) {return 1;} else {return num* factorial (num-1);} console.log (factorial (5)); // 120그러나 위의 함수의 실행은 함수 이름과 밀접하게 결합되며 인수를 사용하여 기능 디 커플 링을 제거 할 수 있습니다.
함수 factorial (num) {if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}} console.log (factorial (5)); // 120그러나 엄격한 모드에서는이 속성에 액세스하면 TypeError 오류가 발생합니다.
기능 factorial (num) { 'strict'; if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}}} // typeError : 'caller', 'callee'및 'Arguments', 'arguments', 'arguments'는 Strict Mode functions 또는 Themconsole (5)에 대한 인수 대상에 액세스 할 수 없습니다.현재 이름 지정된 기능 표현식을 사용할 수 있습니다.
var factorial = function fn (num) {if (num <= 1) {return 1;} else {return num*fn (num-1);}}; Console.log (Factorial (5)); // 120【방문객】
실제로 두 개의 발신자 속성이 있습니다
【1 call 기능 발신자
함수의 발신자 속성은 현재 함수를 호출하는 함수에 대한 참조를 보유합니다. 현재 함수가 글로벌 범위에서 호출되면 그 값은 null입니다.
function irter () {inner ();} 함수 inner () {console.log (inner.caller); // outer () {inner ();}} outter (); 함수 내부 () {console.log (inner.caller); // null} inner ();엄격한 모드 에서이 속성에 액세스하면 TypeError 오류가 발생합니다.
함수 내부 () { 'strict'; // typeError : '발신자'및 '인수'는 제한된 함수 속성 이며이 컨텍스트 constConsole.log (inner.caller);} inner ()에서는 액세스 할 수 없습니다.【2 uments 인수 객체 발신자
이 속성은 항상 정의되지 않습니다. 이 속성은 인수의 발신자 속성을 구별하도록 정의됩니다.
함수 내부 (x) {console.log (arguments.caller); // 정의되지 않은} 내부 (1);마찬가지로 엄격한 모드 에서이 속성에 액세스하면 TypeError 오류가 발생합니다.
함수 내부 (x) { 'strict'; // typeError : '발신자'및 '인수'는 제한된 함수 속성 이며이 컨텍스트 contxtConsole.log (arguments.caller)에서는 액세스 할 수 없습니다.} 내부 (1);기능 과부하
JavaScript 함수는 전통적인 의미에서와 같이 과부하를 구현할 수 없습니다. 다른 언어에서는이 두 정의 (허용 매개 변수의 유형 및 수량)의 서명이 다르면 기능에 대해 두 가지 정의를 작성할 수 있습니다.
JavaScript 함수는 매개 변수가 0 이상의 값을 포함하는 배열로 표시되기 때문에 서명이 없습니다. 기능 서명이 없으면 실제 과부하가 불가능합니다
// 후속 선언은 이전 선언 함수 addSomEnumber (num) {return num + 100;} 함수 addSomeManber (num) {return num + 200; var result = addSomeManber (100); // 300통과 된 함수의 매개 변수 유형과 수량을 확인하고 다른 반응을 만들어 메소드의 과부하 만 시뮬레이션 할 수 있습니다.
function doadd () {if (arguments.length == 1) {alert (Arguments [0] + 10);} else (arguments.length == 2) {alert (arguments [0] + arguments [1]);}} doadd (10); // 20doadd (30,20); // 50매개 변수 패스
JavaScript의 모든 기능은 가치로 전달됩니다. 즉, 함수 외부의 값을 함수 내의 매개 변수에 복사하는 것은 한 변수에서 다른 변수로 값을 복사하는 것과 동일합니다.
【1 type 기본 유형 값
원시 유형의 값을 매개 변수로 전달할 때 전달 된 값은 로컬 변수 (지정된 매개 변수 또는 인수 객체의 요소)에 복사됩니다.
함수 부가 (num) {num += 10; return num;} var count = 20; var result = addten (count); console.log (count); // 20, 변경 사항 없음 console.log (결과); // 30【2 type 참조 유형 값
참조 유형 값을 매개 변수로 전달하면 메모리 에서이 값의 주소가 로컬 변수에 복사 되므로이 로컬 변수의 변경은 기능 외부에 반영됩니다.
함수 setName (obj) {obj.name = 'test';} var person = new Object (); setName (person); console.log (person.name); // 'test'참조 유형의 공식 매개 변수가 함수 내부에서 재정의되면이 변수는 로컬 객체를 나타냅니다. 이 로컬 객체는 함수가 실행 된 직후 파괴됩니다.
함수 setName (obj) {obj.name = 'test'; console.log (person.name); // 'test'obj = new Object (); obj.name ='white '; console.log (person.name); //'test '} var person = new Object (); setName (person);위는 편집기가 귀하에게 소개 한 JavaScript 함수 매개 변수에 대한 심층적 인 이해입니다 (권장). 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!