Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you find out the caller function in JavaScript?

function main() {    Hello(); }  function Hello() {   // How do you find out the caller function is 'main'? } 

Is there a way to find out the call stack?

like image 331
Ray Lu Avatar asked Nov 11 '08 09:11

Ray Lu


People also ask

Which command gives a value to the function caller in JavaScript?

You can use Function. Caller to get the calling function.

What is caller and called function?

Calling conventions constrain both callers and callees. A caller is a function that calls another function; a callee is a function that was called. The currently-executing function is a callee, but not a caller.


2 Answers

StackTrace

You can find the entire stack trace using browser specific code. The good thing is someone already made it; here is the project code on GitHub.

But not all the news is good:

  1. It is really slow to get the stack trace so be careful (read this for more).

  2. You will need to define function names for the stack trace to be legible. Because if you have code like this:

    var Klass = function kls() {    this.Hello = function() { alert(printStackTrace().join('\n\n')); }; } new Klass().Hello(); 

    Google Chrome will alert ... kls.Hello ( ... but most browsers will expect a function name just after the keyword function and will treat it as an anonymous function. An not even Chrome will be able to use the Klass name if you don't give the name kls to the function.

    And by the way, you can pass to the function printStackTrace the option {guess: true} but I didn't find any real improvement by doing that.

  3. Not all browsers give you the same information. That is, parameters, code column, etc.


Caller Function Name

By the way, if you only want the name of the caller function (in most browsers, but not IE) you can use:

arguments.callee.caller.name 

But note that this name will be the one after the function keyword. I found no way (even on Google Chrome) to get more than that without getting the code of the whole function.


Caller Function Code

And summarizing the rest of the best answers (by Pablo Cabrera, nourdine, and Greg Hewgill). The only cross-browser and really safe thing you can use is:

arguments.callee.caller.toString(); 

Which will show the code of the caller function. Sadly, that is not enough for me, and that is why I give you tips for the StackTrace and the caller function Name (although they are not cross-browser).

like image 31
Mariano Desanze Avatar answered Oct 22 '22 02:10

Mariano Desanze


Note that this solution is deprecated and should no longer be used according to MDN documentation

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller


function Hello() {     alert("caller is " + Hello.caller); } 

Note that this feature is non-standard, from Function.caller:

Non-standard
This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.


The following is the old answer from 2008, which is no longer supported in modern Javascript:

function Hello() {     alert("caller is " + arguments.callee.caller.toString()); } 
like image 78
Greg Hewgill Avatar answered Oct 22 '22 01:10

Greg Hewgill