Могу ли я получить имя запущенной функции в JavaScript? - PullRequest
164 голосов
/ 18 июня 2009

Возможно ли это сделать:

myfile.js:
function foo() {
    alert(<my-function-name>);
    // pops-up "foo"
    // or even better: "myfile.js : foo"
}

В моем стеке есть каркасы Dojo и jQuery, поэтому, если они облегчают работу, они доступны.

Ответы [ 18 ]

1 голос
/ 18 июня 2009

Поскольку вы написали функцию с именем foo и знаете, что она находится в myfile.js, зачем вам нужно динамически получать эту информацию?

При этом вы можете использовать arguments.callee.toString() внутри функции (это строковое представление всей функции) и вывести значение имени функции в регулярное выражение.

Вот функция, которая выдаст свое собственное имя:

function foo() {
    re = /^function\s+([^(]+)/
    alert(re.exec(arguments.callee.toString())[1]);             
}
1 голос
/ 30 ноября 2016

Информация актуальна на 2016 год.


Результаты объявления функции

Результат в Опере

>>> (function func11 (){
...     console.log(
...         'Function name:',
...         arguments.callee.toString().match(/function\s+([_\w]+)/)[1])
... })();
... 
... (function func12 (){
...     console.log('Function name:', arguments.callee.name)
... })();
Function name:, func11
Function name:, func12

Результат в Chrome

(function func11 (){
    console.log(
        'Function name:',
        arguments.callee.toString().match(/function\s+([_\w]+)/)[1])
})();

(function func12 (){
    console.log('Function name:', arguments.callee.name)
})();
Function name: func11
Function name: func12

Результат в NodeJS

> (function func11 (){
...     console.log(
.....         'Function name:',
.....         arguments.callee.toString().match(/function\s+([_\w]+)/)[1])
... })();
Function name: func11
undefined
> (function func12 (){
...     console.log('Function name:', arguments.callee.name)
... })();
Function name: func12

Не работает в Firefox. Не проверено на IE и Edge.


Результаты для выражений функций

Результат в NodeJS

> var func11 = function(){
...     console.log('Function name:', arguments.callee.name)
... }; func11();
Function name: func11

Результат в Chrome

var func11 = function(){
    console.log('Function name:', arguments.callee.name)
}; func11();
Function name: func11

Не работает в Firefox, Opera. Не проверено на IE и Edge.

Примечания:

  1. Анонимная функция не имеет смысла проверять.
  2. Среда тестирования

~ $ google-chrome --version
Google Chrome 53.0.2785.116           
~ $ opera --version
Opera 12.16 Build 1860 for Linux x86_64.
~ $ firefox --version
Mozilla Firefox 49.0
~ $ node
node    nodejs  
~ $ nodejs --version
v6.8.1
~ $ uname -a
Linux wlysenko-Aspire 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
0 голосов
/ 12 февраля 2019

Это вариант Игоря Остроумова Ответ:

Если вы хотите использовать его в качестве значения по умолчанию для параметра, вам необходимо рассмотреть вызов второго уровня для вызывающего абонента:

function getFunctionsNameThatCalledThisFunction()
{
  return getFunctionsNameThatCalledThisFunction.caller.caller.name;
}

Это позволит динамически реализовать многократно используемую реализацию в нескольких функциях.

function getFunctionsNameThatCalledThisFunction()
{
  return getFunctionsNameThatCalledThisFunction.caller.caller.name;
}

function bar(myFunctionName = getFunctionsNameThatCalledThisFunction())
{ 
  alert(myFunctionName);
}

// pops-up "foo"
function foo()
{
  bar();
}

function crow()
{
  bar();
}

foo();
crow();

Если вам тоже нужно имя файла, вот решение, использующее ответ от F-3000 на другой вопрос:

function getCurrentFileName()
{
  let currentFilePath = document.scripts[document.scripts.length-1].src 
  let fileName = currentFilePath.split('/').pop() // formatted to the OP's preference

  return fileName 
}

function bar(fileName = getCurrentFileName(),  myFunctionName = getFunctionsNameThatCalledThisFunction())
{
  alert(fileName + ' : ' + myFunctionName);
}

// or even better: "myfile.js : foo"
function foo()
{
  bar();
}
0 голосов
/ 22 июня 2018
(function f() {
    console.log(f.name);  //logs f
})();

Вариант машинописного текста:

function f1() {} 
function f2(f:Function) {
   console.log(f.name);
}

f2(f1);  //Logs f1

Примечание доступно только в двигателях, соответствующих ES6 / ES2015. Подробнее см.

0 голосов
/ 20 июля 2011

Ответ короткий: alert(arguments.callee.name);

0 голосов
/ 25 июля 2014

Сочетание нескольких ответов, которые я видел здесь. (Проверено в FF, Chrome, IE11)

function functionName() 
{
   var myName = functionName.caller.toString();
   myName = myName.substr('function '.length);
   myName = myName.substr(0, myName.indexOf('('));
   return myName;
}

function randomFunction(){
    var proof = "This proves that I found the name '" + functionName() + "'";
    alert(proof);
}

Вызов randomFunction () предупредит строку, содержащую имя функции.

JS Fiddle Demo: http://jsfiddle.net/mjgqfhbe/

0 голосов
/ 03 ноября 2016

Вот один вкладыш:

    arguments.callee.toString().split('\n')[0].substr('function '.length).replace(/\(.*/, "").replace('\r', '')

Как это:

    function logChanges() {
      let whoami = arguments.callee.toString().split('\n')[0].substr('function '.length).replace(/\(.*/, "").replace('\r', '');
      console.log(whoami + ': just getting started.');
    }
0 голосов
/ 18 июня 2009

Попробуйте:

alert(arguments.callee.toString());
...