호출 객체는 실제로 특수 객체 Arguments 객체를 참조하는 인수라는 특수 속성을 정의합니다. Arguments 속성은 호출 객체의 속성이므로 해당 상태는 지역 변수 및 형식 매개변수와 동일합니다. 인수.길이는 매개변수에 전달된 실제 매개변수 수량을 가져올 수 있습니다.
말도 안 됩니다. 예제에서 모든 것을 설명합니다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> <!-- function f(x,y,z) { if (f.length !=arguments.length) { //可以通过读取函数的length和arguments的length属性值来检查形式参数的数量是否相等 //因为前者恰好是形参的数量,而后者是实参数量 //如果不相等抛出异常 throw new Error('function f called with' +arguments.length+'arguments,but it expects'+f.length+'arguments'); } else { document.write("f("+[x,y,z]+')'+'<br/>'); } } try { f(1,2,3); f(2,4);//抛出异常,后面的将不再执行 f(4); f("a","b","c","d","e","f"); } catch (ex) { document.write(ex.message); } //--> </SCRIPT> </BODY> </HTML>
실행 결과:
Java 코드
f(1,2,3) function f called with2arguments,but it expects3arguments
인수는 약간 배열처럼 동작하지만 실제로는 배열이 아닙니다. 조인, 정렬, 슬라이스 등과 같은 JavaScript 핵심 배열의 일부 메서드가 없습니다.
예 Argument 객체를 사용하여 임의의 매개변수를 받는 방법
Java 코드
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> <!-- function f() {// 利用arguments来读取任意个数的参数 document.write("f(" +Array.apply(null,arguments) + ")" +"<br/>");//apply()应用某一对象的一个方法,用另一个对象替换当前对象。 } f(1,2,3); f("a","b"); f(true); //--> </SCRIPT> </BODY> </HTML>
Argument 객체를 사용하여 함수 오버로딩을 시뮬레이션하는 예
Java 코드
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> <!-- function Point() { if(arguments.length ==0)//如果没有参数 { //默认的xy属性都设置0 this.x=0; this.y=0; this.toString=function() { return this.x+" "+ this.y ; } } else if (arguments.length <2)//如果实参小于2 { var p=arguments[0]; if (p instanceof Point )//判断实参类型如果是Point,那么执行属性复制 { this.x =p.x; this.y =p.y this.toString=function() { return this.x+" "+ this.y ; } } else if ( typeof p=="number" || p instanceof Number)//如果是数值,那么这个值作为当前Point的x属性值,y属性默认0 { this.x=(Number)(p); this.y=0; this.toString=function() { return this.x+" "+ this.y ; } } else {//如果这个参数既不是Point又不是Number,抛出类型异常 throw new TypeError("参数类型错误!") } } else if (arguments.length==2) { var x= arguments[0]; var y= arguments[1]; //否则当参数数量为两个并且为number类型的时候,把她们分别作为Point的xy if ((typeof x=='number' || x instanceof 'Number') && typeof y == 'number' ||y instanceof 'Number') { this.x = x; this.y = y; this.toString=function() { return this.x+" "+ this.y ; } } else throw new TypeError('参数类型错误!'); } else { throw new TypeError("参数类型错误!"); } } function dwn(s) { document.write(s+"<br/>"); } dwn(new Point());//00 dwn(new Point(new Point()));//00 dwn(new Point(3));//30 dwn (new Point(4,5));//45 //--> </SCRIPT> </BODY> </HTML>
명명된 매개 변수를 사용하는 함수에서 인수의 매개 변수는 매개 변수가 값 유형인지 참조 유형인지에 관계없이 항상 해당 명명된 매개 변수의 별칭입니다. 인수 참여는 해당 명명된 매개변수에 확실히 영향을 미치며 그 반대도 마찬가지입니다.
Java 코드
function f(x) { alert(x);//参数初始值 arguments[0]++;//改变参数的值 alert(x);//x的值发生了改变 }
Arguments 객체는 또한 callee라는 유용한 속성을 제공합니다. 현재 실행 중인 함수를 적용하려면 다음과 같은 클로저에 매우 유용한 익명 재귀 호출 기능을 제공합니다.
클로저를 사용하여 10의 계승 계산
Java 코드
function(x){ return x>1?x*arguments.callee(x-1):1 }(10);