如何找出在JavaScript中调用函数的位置?

ilg*_*aar 20 javascript function call

是否有可能找出调用函数的位置?如果是,那么如果从全局范围调用函数,从另一个函数,或者可能从浏览器控制台调用,如何检测?

看一下下面的例子:

<script>
    function myFunc1() {
        // some code
        myFunc2(); // I was called from myFunc1()
    }
    function myFunc2() {
        var callerName = new String;
        callerName = arguments.callee.caller.name;
        // some code
        alert('I was called from ' + callerName + ' function');
    }
    myFunc2(); // I was called from global scope
</script>
Run Code Online (Sandbox Code Playgroud)

我知道callerName = arguments.callee.caller.name;上面例子中的这一行会给我调用函数的名字.但我不知道如何检测是否从全局范围调用函数.例如,如果我更改myFunc2()并添加一个if else语句来检查是否arguments.callee.caller.name返回一个undefined值,知道这将发生,当从全局范围调用一个函数时:

myFunc2() {
var callerName = new String;
callerName = arguments.callee.caller.name;
    if(callerName == undefined) {
        alert('I was called from global scope');
    } else {
        alert('I was called from ' + callerName + ' function');
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果myFunc2()从全局范围调用此方法并且callerName = arguments.callee.caller.name;将导致JavaScript抛出以下错误,则此方法无效:

TypeError: 'null' is not an object (evaluating 'arguments.callee.caller.name')
Run Code Online (Sandbox Code Playgroud)

所以我回到原点,问题仍然存在:

  • 如何检测是否从全局范围调用函数
  • 如果从全局范围调用它,它是否来自浏览器控制台?

Gen*_*ano 14

在Chrome中,您可以使用:

console.trace();
Run Code Online (Sandbox Code Playgroud)

只需在函数中添加该行,我通常将其作为第一行.如果您查看控制台,您将看到您的功能名称,在该行下方,您将看到它的调用位置.

  • 这应该是公认的答案,简单且非常有用! (2认同)
  • 这个功能怎么可能存在而不出现在 JS 必须知道的列表中。谢谢你的启发 (2认同)

bfa*_*tto 7

如果从全局范围调用该函数,arguments.callee.caller.name则将是未定义的.否则,它将是调用函数的名称(也代表调用它的范围).

所以你已经拥有的应该工作,除了在严格的模式,arguments.callee没有可用的.


另外:浏览器中提供的开发人员工具可能是检查此类事情的更好方法:只需设置断点并查看堆栈跟踪面板.除非您的代码本身需要在运行时知道调用范围.