zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    功能测试-用例设计
    性能测试网址
    怎么调整磁盘分区的大小
    NIKKEI Programming Contest 2019-2 Task E. Non-triangular Triplets
    AtCoder Beginner Contest 131 Task F. Must Be Rectangular
    CF1244C The Football Season
    NIKKEI Programming Contest 2019-2 Task D. Shortest Path on a Line
    常见组合计数问题汇总
    【B2B】01-BFS
    【C++】A trick I learned:put boilerplate code into constructor of a struct
  • 原文地址:https://www.cnblogs.com/autismtune/p/5181461.html
Copyright © 2011-2022 走看看