如果有一个函数像下面这样:

function fn(){

}

那么fn这个函数下面就有一个arguments属性(你在逗我么,后面又说对象),该属性是个对象(typeof一下就知道了),然后它下面也有属性;

说到arguments有属性,那么属性有什么呢,恩~下面就介绍其中一个属性:callee;先看怎么用吧:

function fn(){

  alert( arguments.callee )

}
fn();

执行结果弹出:function fn(){alert( arguments.callee )},仔细看,其实就是得到fn这个函数自身。

至于这个的用处嘛,需要在函数里再次使用自身函数的时候(尤其是匿名函数呢),我想用的比较的多地方应该是做【递归】运算的时候,比如说老生常谈的一个例子,求10的阶乘:

    function fn(num){

      if(num==1){

        return 1

      }else{

        return num*arguments.callee(--num)

      }
} console.log( fn(10) )

结果不显而易见:3628800;恩~这个不是重点,重点是上面用到了arguments.callee这个东西(该叫它属性呢?还是方法呢?还是东西吧,这个绝对没错,苦笑╮(╯_╰)╭)

这个例子的话还是算了,打动不了我学这个方法的心,哎,那就来个比较实用的吧,给本地对象Array添加一个方法 - 将多维数组转换成一维数组:

    if(!Array.prototype.toSingle){
Array.prototype.toSingle=function(){ //将多维数组转换成一维数组
return (function(aData){
for(var i=0, len=aData.length, arr=[]; i<len; i++){
arr=arr.concat( Array.isArray(aData[i]) ? arguments.callee(aData[i]) : aData[i] )
}
return arr
})(this)
}
}

恩~这个还可以。使用一下试试:

console.log( [[1,2,[3,4,[1,-5,-9,0,2,56],5]],[2,5],50].toSingle() )

结果显而易见了:[1, 2, 3, 4, 1, -5, -9, 0, 2, 56, 5, 2, 5, 50];

好像还没介绍arguments对象,那就和它的另一个属性length一起说吧,

arguments:(还)表示函数的实参列表,再说的通俗易懂点就是表示一个函数的实际参数的列表,

arguments.length:表示实参列表的长度。

    function fn(a,b,c,d){
alert( a )
alert( arguments.length )
alert( arguments[0] )
}
fn(8,9)
结果先不管,像上面这样,a,b,c,d就是函数【fn】的形参 -- 形式上的参数,而【fn】函数实际上呢只传进了2个参数:8,9;所以arguments.length就等于2,arguments就是相当于数组[8,9];所以不想用a,b来得到8,9的话还可以用arguments[0]得到【8】,
arguments[1]得到【9】;但是arguments不是数组,不能对它使用shift、push、join等方法。上面的执行结果:
    alert( a )    //
alert( arguments.length ) // 2(个)
alert( arguments[0] ) //

●然后(最后)就是caller了,重新来个函数吧,假设现在有一个函数【a】:
    function a(){
    
}

caller是什么?怎么使用?  caller是函数【a】下面的一个方法,这样使用↓:

    function a(){
alert( a.caller )
}
a();

结果:null,就是空!caller表示:返回调用【a】函数的函数,很明显,a没有被任何函数调用,或者说没有在任何函数里面被使用一下。

那么使用一下是怎么样的呢↓:

    function a(){
alert( a.caller )
}
function b(){
a()
}
b()

这样就会弹出函数【b】:

function b(){
a()
}
毋庸置疑,刚才都说了,a.caller返回调用【a】函数的函数,很明显,【a】函数在【b】函数里被调用了!
恩~刚刚才了解了arguments.cellee,这里是不是可以试试手捏╮(╯▽╰)╭(jiranmeiyoudonghuabiaoqing!_!),像这样:
    function a(){
alert( arguments.callee.caller )
}
function b(){
a()
}
b()
嗦嘎,结果还是上面的function b(){a()},孺子可教也呀。
师傅,话说caller的实际用处呢,是不是不大!恩~好像是这样的,为师也没怎么用到过***

arguments .length .callee caller的更多相关文章

  1. JavaScript Function arguments.callee caller length return

    一.Function 函数是对象,函数名是指针. 函数名实际上是一个指向函数对象的指针. 使用不带圆括号的函数名是访问函数指针,并非调用函数. 函数的名字仅仅是一个包含指针的变量而已.即使在不同的环境 ...

  2. JavaScript中的arguments,callee,caller

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

  3. 理解JavaScript中的arguments,callee,caller,apply

    arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n] 参数function :选项.当前正在执行的 Function 对象的名字. n : ...

  4. js的隐含参数(arguments,callee,caller)使用方法

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

  5. JQuery Pagenation 知识点整理——arguments,callee,caller,apply应用(20150517)(转)

    arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function :选项.当前正在执行的 Function 对象的名字. n :选 ...

  6. JavaScript中的內定物件與函式: arguments, callee, caller, this, apply(), call()

    arguments, caller, callee, this都是用在函式(function)內的特殊內定物件.而apply()及call()則是用來呼叫函式的不同作法. arguments可用來取得 ...

  7. arguments对象,caller 和 callee

    arguments对象是比较特别的一个对象,arguments非常类似Array,但实际上又不是一个Array实例. 它指的是函数对象里的参数,且只能在函数内部使用. 使用 检测函数的参数个数,引用属 ...

  8. arguments.callee.caller

    1.Arguments Arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性l ...

  9. 关于arguments.callee.caller.arguments[0]获得event的一些问题

    先从一个简单的例子说起,一个简单的button控件如下: < input  type ='button'  name ='mybtn'  id ='mybtn'  onclick ='myFun ...

随机推荐

  1. [ActionScript 3.0] as3可以通过CDATA标签声明多行字符串

    var str:String=<![CDATA[YANSHUANGPING yanshuangping yanshuangping ]]>; trace(str); var myname: ...

  2. java的io读取

    package gys; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; imp ...

  3. C语言实现词频统计——第二版

    原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命 ...

  4. ibatis配置多表关联(一对一、一对多、多对多)

    iBatis的多表关联. ibatis的表关联,和数据库语句无关,是在程序中,把若干语句的结果关联到一起.这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便. 这里用表lo ...

  5. HDU 4334 Trouble

    Trouble Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  6. 0901~0907面试总结(腾讯CDC、金蝶)

    纯脑记,但应该不会差太多 20150901腾讯CDC面试(初级外包岗) 0826的上午先用QQ进行了初步沟通,要求做一个不考虑AI的井字棋游戏,0830上午E-mail上交了做好的DEMO,然后等了几 ...

  7. [译] Closures in Lua - Lua中的闭包

    原文:(PDF) . 摘要 一等(first-class)函数是一种非常强大的语言结构,并且是函数式语言的基础特性.少数过程式语言由于其基于栈的实现,也支持一等函数.本文讨论了Lua 5.x用于实现一 ...

  8. Flex Alert的匿名回调函数如何得到正确的this

    Flex中经常使用Alert来弹出提示或确认窗口,为了方便省事,会直接用匿名函数作为回调,但有时如果要调用外部的this,你会发现匿名函数中的this无法指向外部父类,可以使用e.target获取pa ...

  9. SDUT 3347 数据结构实验之数组三:快速转置

    数据结构实验之数组三:快速转置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 转置运算是一 ...

  10. 【PL/SQL练习】命名块: 存储过程、函数、触发器、包

    创建时定义名称 2.可以被Oracle server 保存 3.可以被任何程序调用 4.可以被共享 存储过程: 1.不带参数的存储过程: SQL> create or replace proce ...