使用`function.caller`

时间:2017-01-29 21:28:07

标签: javascript

两部分问题:

  1. 如何从对象方法中获取function.caller
  2. 如何使用该值实际调用函数。
  3. 示例:

    foo = {
        bar: function() {console.log(bar.caller);}
    }
    

    >> SyntaxError: function statement requires a name

    示例2:

    [bar.caller]();

    提前致谢

2 个答案:

答案 0 :(得分:1)

您发布的代码存在的问题是bar并不代表匿名函数中的任何内容。名称" bar"是分配给foo的对象的属性名称。因此,这很好用:

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

function x() {
  foo.bar();
}

x();

该功能不需要名称;那是无关紧要的。为了进入caller属性,您需要对该函数的引用,这可以来自任何地方。因此,这也可以起作用:

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

function x() {
  foo.bar();
}

x();

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

答案 1 :(得分:0)

要获取调用者(如果存在),请使用:

var caller = arguments.callee.caller;

要使用它,您必须首先检查它是否存在:

if(caller)
    caller();

示例:

function foo(param){
  if(param == 5) return console.log(param);
  
  var caller = arguments.callee.caller;
  if(caller)
    caller(param + 1);
}

function bar(param){
  foo(param);
}

foo(3); // won't log anything (no caller and param != 5)

bar(3); // will cause a recursion until param == 5 then logs it.