Javascript 使用`function.caller`

Javascript 使用`function.caller`,javascript,Javascript,问题分两部分: 如何从对象方法获取function.caller 如何使用该值实际调用函数 例如: foo = { bar: function() {console.log(bar.caller);} } >语法错误:函数语句需要名称 例2: [bar.caller]() 提前感谢要让来电者(如果存在)使用以下方法: var caller = arguments.callee.caller; 要使用它,您必须先检查它是否存在,如下所示: if(caller) caller()

问题分两部分:

  • 如何从对象方法获取
    function.caller
  • 如何使用该值实际调用函数
  • 例如:

    foo = {
        bar: function() {console.log(bar.caller);}
    }
    
    >语法错误:函数语句需要名称

    例2:

    [bar.caller]()

    提前感谢

    要让来电者(如果存在)使用以下方法:

    var caller = arguments.callee.caller;
    
    要使用它,您必须先检查它是否存在,如下所示:

    if(caller)
        caller();
    
    示例:

    函数foo(param){
    if(param==5)返回console.log(param);
    var caller=arguments.callee.caller;
    如果(呼叫者)
    调用者(参数+1);
    }
    功能条(参数){
    foo(param);
    }
    foo(3);//不会记录任何内容(无调用方和参数!=5)
    
    酒吧(3);//将导致递归,直到param==5,然后记录它。
    您发布的代码的问题是,
    bar
    在匿名函数中没有任何意义。名称“bar”是指定给
    foo
    的对象的属性名称。因此,这很好:

    var foo = {
      bar: function() {
        console.log("Caller is: " + foo.bar.caller);
      }
    };
    
    function x() {
      foo.bar();
    }
    
    x();
    
    函数不需要名称;那无关紧要。为了访问
    调用者
    属性,您需要对函数的引用,该引用可以来自任何地方。因此,这也将有助于:

    var foo = {
      bar: function() {
        console.log("Caller is: " + this.bar.caller);
      }
    };
    
    function x() {
      foo.bar();
    }
    
    x();
    

    因为当该函数作为
    foo.bar()
    调用时,
    this
    的值将是“foo”对象。

    通常,
    this
    将是调用该方法的对象的值,但有一些警告。如果调用是作为
    foo.bar()
    完成的,则
    将是
    foo
    对象。至于错误,它似乎来自其他地方。当您使用无效的函数声明语法时,会出现该错误;没有名字的人。您显示的唯一函数是表达式,而不是声明,因此不会产生错误。我不知道您试图实现什么,但是
    函数。调用方
    (以及
    参数。调用方
    参数。被调用方
    是且不打算在生产代码中使用。@allnodcom这是一个非标准功能,您应该在生产代码中避免这种情况<代码>此功能是非标准的,不在标准轨道上。不要在面向Web的生产站点上使用它:它不会适用于所有用户。实现之间也可能存在很大的不兼容,将来行为可能会改变。
    但是
    参数
    对象已被降级。@allnodcoms:
    参数
    对象未被弃用。@allnodcoms
    参数
    未被弃用。证明???@allnodcom此sais
    函数。调用方
    已弃用,而非
    参数
    已弃用。看一看!您不应该使用,它的[removed from
    strict mode
    ](为什么arguments.callee从ES5 strict mode中删除?)。而且不受支持!使用这只是一种不好的做法。当
    foo
    被重新分配或
    this
    被证明是一个意外值时,缺少函数名就变得非常重要了。@squint同意;事实上,我不会以这种方式编写代码,可能会执行类似于在闭包中创建“foo”对象之类的操作,或者确保从函数访问对象。(从更广泛的意义上说,我不确定我是否真的想要
    函数.caller
    ,尽管我认为在某些调试实例中它可能有用。)是的,很难说服我将
    .caller
    用于任何其他用途是最好的方法,但谁知道我猜呢。也许是调试,但在调用堆栈上有一个可视的断点对我来说确实更好。@Pointy-nail它。。。只是需要增加特异性。谢谢你,伙计。而当你在点名时,你却在点名“打电话的人”;o) @allnodcoms
    foo.bar.caller()
    将调用调用方函数