JS 的 Caller 属性,用于“foo = function()”编码风格[重复]

问题描述 投票:0回答:1

我想将“caller”的属性用于定义的函数here

对于这种风格的函数声明来说效果很好

    function g() {
      alert(g.caller.name) // f
}

   function f() {
      alert(f.caller.name) // undefined
      g()
}

f()

JSfiddle

但是我的函数声明是这样的

    g = function() {
      alert(g.caller.name) // expected f, getting undefined
    }


   f = function() {
     alert("calling f")
     alert(f.caller.name) // undefined
     g()
   }

 f()

我变得不确定(基本上没有得到任何东西)

JSfiddle

有什么方法可以使用调用者属性而无需重写我的代码吗?另外,我希望我在使用和函数声明方面没有犯任何错误,因为我对使用 JS 还很陌生。

javascript function function-expression javascript-function-declaration
1个回答
1
投票

这个功能...

f = function() {
    g();
};

...没有名字。它是一个匿名函数,分配给一个标识符为

f
的变量。如果您将该函数设为命名函数表达式

,它将按原样工作
f = function f() {
    g();
};

请注意,由于该匿名函数是从全局执行上下文中调用的,因此它的

caller
属性是
null
(请注意,在 JSFiddle 中,它不会是
null
,它将是 JSFiddle 调用来调用您的代码的任何函数).

您已经演示了函数声明和函数表达式之间的区别之一。您的第一个示例显示了函数声明。他们必须有一个标识符。您的第二个示例使用函数表达式。标识符是可选的,并且仅在函数本身的范围内。

© www.soinside.com 2019 - 2024. All rights reserved.