arguments详解

arguments 是什么?

是一个对象,一个 很像数组的对象

arguments内容是什么?

1是函数运行时的实参列表

2收到实参收集起来,放到一个arguments对象里

在词法分析中,首先按形参形成AO的属性,值为undefined

当实参传来时,再修改AO的相应属性

t(a,b,c){};

调用时:t(1,2,3,4,5)个参数,

此时AO属性有a,b,c三个属性,arguments里有1,2,3,4,5所有的值

对于超出形参个数之外的实参,可以通过arguments来获得

3arguments的索引从0,1,2递增,与实参对应

4arguments.length属性代表实参的个数

5arguments一定不是数组,是长得比较像数组的一个对象,虽然也有length属性

6arguments每个函数都会有,因此,arguments只会在内部找自身的arguments,无法引用外部的arguments

(function(d,e,f){
                //在此函数内,无法用d,e,f形参来取得“haha”,因为没有与之相应的形参
                //但我们可以用arguments来获取任意多个的实参
                
                console.log(arguments[3]);

            })("Hello","world","?","haha");

(function(d,e,f){
                alert(typeof arguments);
            })("Hello","world","?");          //object

callee与caller

caller返回一个函数的引用,这个函数调用了当前的函数;callee放回正在执行的函数本身的引用,它是arguments的一个属性

caller
caller返回一个函数的引用,这个函数调用了当前的函数。
使用这个属性要注意:
1 这个属性只有当函数在执行时才有用
2 如果在javascript程序中,函数是由顶层调用的,则返回null

functionName.caller: functionName是当前正在执行的函数。

  1. var a = function() {   
  2. alert(a.caller);   
  3. }   
  4. var b = function() {   
  5. a();   
  6. }   
  7. b();  


上面的代码中,b调用了a,那么a.caller返回的是b的引用,结果如下:

  1. var b = function() {   
  2. a();   
  3. }   

如果直接调用a(即a在任何函数中被调用,也就是顶层调用),返回null:

  1. var a = function() {   
  2. alert(a.caller);   
  3. }   
  4. var b = function() {   
  5. a();   
  6. }   
  7. //b();   
  8. a();  

输出结果:

null

callee
callee放回正在执行的函数本身的引用,它是arguments的一个属性
使用callee时要注意:
1 这个属性只有在函数执行时才有效
2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
3 它可以用来递归匿名函数。

  1. var a = function() {   
  2. alert(arguments.callee);   
  3. }   
  4. var b = function() {   
  5. a();   
  6. }   
  7. b();  

a在b中被调用,但是它返回了a本身的引用,结果如下:

    1. var a = function() {   
    2. alert(arguments.callee);   
    3. }  
原文地址:https://www.cnblogs.com/autismtune/p/5181461.html