现在的位置: 首页 > 综合 > 正文

[zz]javascript的arguments,caller,callee,call,apply样例及理解

2013年03月09日 ⁄ 综合 ⁄ 共 2799字 ⁄ 字号 评论关闭

引文详见:JavaScript中的arguments,callee,caller,call,appy

代码及理解如下:

code
<script language="JavaScript">
/**//*
 * 演示arguments的用法,如何获取实参数和形数数
 
*/
function argTest(a,b,c,d){
    
var numargs = arguments.length;     // 获取被传递参数的数值。
    var expargs = argTest.length;       // 获取期望参数的数值。
    alert("实参数目为:"+numargs)
    alert(
"形数数目为:"+expargs)

    alert(arguments[0])         
    alert(argTest[
0])          //undefined 没有这种用法
}
//argTest(1,2)
//
结果:实参数目为:2;形数数目为:4;1;undefined
//
argTest(1,2,3,4,5)
//
结果:实参数目为:5;形数数目为:4;1;undefined
/*
总结:js参数传递不像c#等语法要求的必须与函数定义一致,可以根据应用不同增加或减少参数,极端情况可以不声明参数,如*/
    
var test = function(){
        
var a = 0;
        
var l = 0;
        
while(l<arguments.length)
        {
            a 
+= arguments[l];
            l
++;
        }
        alert(a);
    }
    test();
//0
    test(1,2);//3

/**//*
 *  arguments不是数组(Array类)
 
*/

Array.prototype.selfvalue = 1;
//此处就是为人诟病的渲染原声对象吧
function testAguments(){
    alert(
"arguments.selfvalue="+arguments.selfvalue);
}
//alert("Array.sefvalue="+new Array().selfvalue);
/*
上面的调用说明所有Array对象的selfvalue都等于1*/
//testAguments();
/*
结果undefined说明arguments并非Array类型*/

/**//*
 * 演示函数的caller属性.
 * 说明:(当前函数).caller:返回一个对函数的引用,该函数调用了当前函数
 
*/

function callerDemo() {
    
if (callerDemo.caller) {
        
var a= callerDemo.caller.arguments[0];
        alert(a);
    } 
else {
        alert(
"this is a top function");
    }
}
function handleCaller() {
    callerDemo();
}

//callerDemo();
//
结果:this is a top function
//
handleCaller("参数1","参数2");
//
结果:参数1
/*
总结:caller应用于函数对象,可以取到上层调用的函数对象及参数
*/

/**//*
 * 演示函数的callee属性.
 * 说明:arguments.callee:初始值就是正被执行的 Function 对象,用于匿名函数
 
*/
function calleeDemo() {
    alert(arguments.callee);
}
//calleeDemo();
//
(function(arg0,arg1){alert("形数数目为:"+arguments.callee.length)})();
/*
总结:可用于实现递归,如:*/
       
var i = 0;
    
var a = function(){
        i 
+= arguments[0];
        
if(i>100||i==0)
            alert(i);
        
else
            arguments.callee(i);
    };
    a(
1);
//结果128,其实就是2的7次方

/**//*
 * 演示apply,call函数的用法
 * 说明:作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别:
 *       apply(thisArg,argArray);
 *     call(thisArg[,arg1,arg2…] ]);
 *     即所有函数内部的this指针都会被赋值为thisArg
 
*/

 function ObjectA(){
    alert(
"执行ObjectA()");
    alert(arguments[
0]);
    
this.hit=function(msg){alert(msg)}
    
this.info="我来自ObjectA"
 }
 
 
function ObjectB(){
    alert(
"执行ObjectB()");
    
//调用ObjectA()方法,同时ObjectA构造函数中的所有this就会被ObjectB中的this替代
    ObjectA.apply(this,arguments);//ObjectA.call(this);
    alert(this.info);
 }
 
//ObjectB('参数0');
/*
总结:通常同callee联用*/
var i = 0
function a(b)
{
    i
++;
    
if(i>4)
        
return i;
    
else
        
return arguments.callee.call(this,b);
}
alert(a(
0));

//讲述this作用域的问题

 
var value="global 变量";
 
function Obj(){
    
this.value="对象!";
 }
 
function Fun1(){
    alert(
this.value);
 }
 
//Fun1();
//
结果:global 变量
 //Fun1.apply(window);
//
结果:global 变量,默认this=window
 //Fun1.apply(new Obj());
//
结果:对象,this=new Obj();Obj中的this指的是函数对象实例
</script>

 

抱歉!评论已关闭.