>php教程 >PHP开发 >인수 객체

인수 객체

高洛峰
高洛峰원래의
2016-12-14 09:56:441177검색

호출 객체는 실제로 특수 객체 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(&#39;function f called with&#39; +arguments.length+&#39;arguments,but it expects&#39;+f.length+&#39;arguments&#39;);  
        }  
        else   
        {  
            document.write("f("+[x,y,z]+&#39;)&#39;+&#39;<br/>&#39;);  
        }  
    }  
  
    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==&#39;number&#39; || x instanceof &#39;Number&#39;) && typeof y == &#39;number&#39; ||y instanceof &#39;Number&#39;)  
            {  
                this.x = x;  
                this.y = y;  
                this.toString=function()  
                {  
                    return this.x+" "+ this.y ;  
                }  
            }  
            else  
                throw new TypeError(&#39;参数类型错误!&#39;);  
        }  
        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);


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