全面理解javascript的caller,callee,call,apply概念

作者:Baldwin 来源:Baldwin's DNN 时间:2007-12-02 17:44:00 

(在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义 2007-05-21

在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数。

[function.]arguments[n]参数
function :选项。当前正在执行的 Function 对象的名字。
n :选项。要传递给 Function 对象的从0开始的参数值索引。

说明 Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。 Arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。

下边例子详细说明了这些性质:

//arguments 对象的用法。
function ArgTest(a, b){
   var i, s = "The ArgTest function expected ";
   var numargs = arguments.length;     // 获取被传递参数的数值。
   var expargs = ArgTest.length;       // 获取期望参数的数值。
   if (expargs < 2)
      s += expargs + " argument. ";
   else
      s += expargs + " arguments. ";
   if (numargs < 2)
      s += numargs + " was passed.";
   else
      s += numargs + " were passed.";
   s += "\n\n"
   for (i =0 ; i < numargs; i++){      // 获取参数内容。
   s += "  Arg " + i + " = " + arguments[i] + "\n";
   }
   return(s);                          // 返回参数列表。
}

在此添加了一个说明arguments不是数组(Array类)的代码:

Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);
function testAguments(){
    alert(arguments.selfvalue);
}

运行代码你会发现第一个alert显示1,这表示数组对象拥有selfvalue属性,值为1,而当你调用函数testAguments时,你会发现显示的是“undefined”,说明了不是arguments的属性,即arguments并不是一个数组对象。

在此附加上大家推荐的一个简单方法: 


alert(arguments instanceof Array);
alert(arguments instanceof Object);   caller


返回一个对函数的引用,该函数调用了当前函数。

functionName.caller
  functionName 对象是所执行函数的名称。

说明

对于函数来说,caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。

下面的例子说明了 caller 属性的用法:


// caller demo {
function callerDemo() {
    if (callerDemo.caller) {
        var a= callerDemo.caller.toString();
        alert(a);
    } else {
        alert("this is a top function");
    }
}
function handleCaller() {
    callerDemo();


标签:caller,callee,call,apply,javascript
0
投稿

猜你喜欢

  • AJAX请求类下载

    2007-08-23 08:33:00
  • 胜过语言的图形符号

    2009-05-06 12:43:00
  • asp如何制作一个防止多次刷新计数的图片计数器?

    2010-06-29 21:28:00
  • asp中常用的字符串安全处理函数集合(过滤特殊字符等)

    2011-02-20 10:40:00
  • 将字符实体引用转换成 Unicode 字符

    2011-07-01 12:31:51
  • Web UI 设计(网页设计)命名规范

    2009-05-13 13:06:00
  • Form Post提交容量大的数据

    2011-03-31 10:53:00
  • 教你如何利用SQL Server保护数据

    2010-06-07 14:18:00
  • 有关Server.Mappath详细接触

    2010-07-07 11:35:00
  • border-radius与圆角

    2008-12-29 14:05:00
  • sql server对字段的添加修改删除、以及字段的说明

    2012-01-05 18:50:52
  • windows系统下让mysql支持federated的storage engine

    2010-01-20 11:16:00
  • XPath 1.0 学习笔记

    2009-02-25 12:19:00
  • Adobe发布Flash Player 10正式版

    2008-10-15 17:15:00
  • asp中如何对ip段进行过滤限制

    2007-09-17 11:14:00
  • 一个简单的ASP计数器代码

    2010-04-24 15:49:00
  • oracle命令行删除与创建用户的代码

    2009-03-02 10:54:00
  • Oracle CBO 的 _sort_elimination_cost_ratio 参数

    2008-07-22 12:24:00
  • 我的栅格系统实现

    2008-09-21 13:50:00
  • div水平垂直居中方法(淘宝招聘css题目)

    2007-10-25 12:48:00
  • asp之家 网络编程 m.aspxhome.com