Я могу получить название в настоящее время рабочей функции в JavaScript?

Я бы создал временную таблицу с различными значениями для evid, place, Officer, Trident и всех других полей, которые должны различаться:

SELECT
    MIN(item) AS "item"
  , evid
  , place
  , officer
  , trident
  , SPACE(100) AS "roles"
INTO #tmp
FROM table
GROUP BY
  , evid
  , place
  , officer
  , trident

UPDATE #tmp SET roles = '';

На следующем шаге вы должны агрегировать роли Поскольку ADS не имеет функции STRING_AGG, вы должны делать это с помощью курсоров, циклов и т. д.

Я уже писал такой код раньше, , посмотрите здесь , например.

Затем вы можете просто удалить всю исходную таблицу и вставить данные из временной таблицы. В идеале я бы сделал эти последние шаги в транзакции.

BEGIN TRANSACTION;

DELETE FROM table;
-- Assuming the table and the temp table have the same exact fields
INSERT INTO table SELECT * FROM #tmp;

END TRANSACTION;

172
задан informatik01 26 October 2013 в 02:18
поделиться

8 ответов

Вы можете получить его, используя arguments.callee .

Однако вам, возможно, придется разобрать имя, так как оно, вероятно, будет содержать дополнительный мусор . Хотя в некоторых реализациях вы можете просто получить имя, используя arguments.callee.name .

Анализ:

function DisplayMyName() 
{
   var myName = arguments.callee.toString();
   myName = myName.substr('function '.length);
   myName = myName.substr(0, myName.indexOf('('));

   alert(myName);
}

Источник: Javascript - получить текущее имя функции .

186
ответ дан 23 November 2019 в 20:39
поделиться

Название текущей функции и как это может быть получено, кажется, переключило прошлые 10 лет, так как этот вопрос задали.

Теперь, не будучи про веб-разработчиком, который знает обо всех историях всех браузеров, когда-либо существовавших, вот то, как это работает на меня в браузере Chrome 2019 года:

function callerName() {
    return callerName.caller.name;
}
function foo() {
    let myname = callerName();
    // do something with it...
}

Некоторые из других ответов столкнулись с некоторыми хромовыми ошибками о строгом коде JavaScript и этажерке.

0
ответ дан 23 November 2019 в 20:39
поделиться

Попробуйте:

alert(arguments.callee.toString());
-2
ответ дан 23 November 2019 в 20:39
поделиться

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

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

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

function foo() {
    re = /^function\s+([^(]+)/
    alert(re.exec(arguments.callee.toString())[1]);             
}
1
ответ дан 23 November 2019 в 20:39
поделиться

Это должно сработать:

var fn = arguments.callee.toString().match(/function\s+([^\s\(]+)/);
alert(fn[1]);

Для вызывающего просто используйте caller.toString () .

21
ответ дан 23 November 2019 в 20:39
поделиться

Для неанонимных функций

function foo()
{ 
    alert(arguments.callee.name)
}

Но в случае обработчика ошибок результатом будет имя функции обработчика ошибок, не так ли?

67
ответ дан 23 November 2019 в 20:39
поделиться

Это должно входить в категорию «самых уродливых взломов в мире», но вот, пожалуйста.

Сначала напечатайте имя ] Текущая функция (как и в других ответах), кажется, имеет для меня ограниченное применение, поскольку вы вроде уже знаете, что это за функция!

Однако определение имени вызывающей функции может быть очень полезным для функции трассировки. Это с регулярным выражением, но использование indexOf будет примерно в 3 раза быстрее:

function getFunctionName() {
    var re = /function (.*?)\(/
    var s = getFunctionName.caller.toString();
    var m = re.exec( s )
    return m[1];
}

function me() {
    console.log( getFunctionName() );
}

me();
10
ответ дан 23 November 2019 в 20:39
поделиться

Другим вариантом использования может быть диспетчер событий, привязанный во время выполнения:

MyClass = function () {
  this.events = {};

  // Fire up an event (most probably from inside an instance method)
  this.OnFirstRun();

  // Fire up other event (most probably from inside an instance method)
  this.OnLastRun();

}

MyClass.prototype.dispatchEvents = function () {
  var EventStack=this.events[GetFunctionName()], i=EventStack.length-1;

  do EventStack[i]();
  while (i--);
}

MyClass.prototype.setEvent = function (event, callback) {
  this.events[event] = [];
  this.events[event].push(callback);
  this["On"+event] = this.dispatchEvents;
}

MyObject = new MyClass();
MyObject.setEvent ("FirstRun", somecallback);
MyObject.setEvent ("FirstRun", someothercallback);
MyObject.setEvent ("LastRun", yetanothercallback);

Преимущество здесь в том, что диспетчер можно легко повторно использовать и ему не нужно получать очередь отправки в качестве аргумента, вместо этого это подразумевается с именем вызова ...

В конце, общий случай, представленный здесь, будет «использование имени функции в качестве аргумента, чтобы вам не приходилось передавать его явно», и это может быть полезно во многих случаях, например, jquery animate () необязательный обратный вызов или в обратных вызовах таймаутов / интервалов (т.е. вы передаете только ИМЯ функции).

3
ответ дан 23 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: