Как я могу получить доступ к имени функции внутри этой функции?
// parasitic inheritance
var ns.parent.child = function() {
var parent = new ns.parent();
parent.newFunc = function() {
}
return parent;
}
var ns.parent = function() {
// at this point, i want to know who the child is that called the parent
// ie
}
var obj = new ns.parent.child();
javascript
function
Скотт Кларенбах
источник
источник
Ответы:
В ES5 лучше всего сделать следующее:
Использование не
Function.caller
является стандартным.Function.caller
иarguments.callee
оба запрещены в строгом режиме.Редактировать: ответ nus на основе регулярных выражений ниже достигает того же, но имеет лучшую производительность!
В ES6 вы можете просто использовать
myFunction.name
.Примечание. Помните, что некоторые минификаторы JS могут выбрасывать имена функций для лучшего сжатия; вам может понадобиться настроить их настройки, чтобы избежать этого.
источник
fun.toString().substr(0, 100)
чего для моих нужд будет достаточно, чтобы найти нужную функцию. Итак, спасибо за вдохновение!myFunction.name
это лучшее, что можно сделать в ES6.myFunction.name
если вы вводите имя функции? побеждает цель магических переменных.arr[index].name
также будет работать :)myFunction.name
также будет обновлено. Конечно, intelliJ поддерживает переименование идентификаторов в строках, но это работает гораздо менее согласованно и устареет, если кто-нибудь забудет поставить галочку в опции «искать в строках».myFunction.name
это немного лучший выбор, чем жесткое кодирование строки.ES6 (вдохновленный ответом Сэнди Халима ниже):
Пояснение по МДН . С 2015 года работает в nodejs и во всех основных браузерах, кроме IE.
Примечание: для связанных функций это даст "
bound <originalName>
". Вам придется лишить «связанного», если вы хотите получить оригинальное имя.ES5 (вдохновленный ответом Влада):
Если у вас есть ссылка на функцию, вы можете сделать:
caller
иcallee
считается устаревшим.[1] Я включил его сюда, потому что он является законным и достаточно часто инструменты подсветки синтаксиса не учитывают пробел между именем функции и круглыми скобками. С другой стороны, я не знаю ни о какой реализации .toString (), которая будет включать здесь пробелы, поэтому вы можете ее опустить.
В качестве ответа на первоначальный вопрос я бы отказался от паразитического наследования и остановился на некоторых более традиционных шаблонах проектирования ООП. Я написал TidBits.OoJs для удобного написания кода ООП на JavaScript с набором функций, имитирующим C ++ (еще не завершенным, но в основном).
Из комментариев я вижу, что вы хотели бы избежать передачи информационных
parent
потребностей его конструктору. Я должен признать, что традиционные шаблоны проектирования не спасут вас от этого, хотя, как правило, считается хорошей идеей сделать ваши зависимости очевидными и обязательными.Я также предложил бы держаться подальше от анонимных функций. Они делают только отладку и профилирование PITA, потому что все просто проявляется как «анонимная функция», и я не вижу в них никакой пользы.
источник
.name
свойство метода компонента показывалось как строка «значение», независимо от того, как оно было вызвано. Как ни странно, во время тестирования в приложении expo все было в порядке, однако, после компиляции в реальное приложение, оно молча зависало.то, что вы делаете, это присваиваете неназванную функцию переменной. вам, вероятно, вместо этого нужно использовать выражение именованной функции ( http://kangax.github.com/nfe/ ).
однако я не уверен, сколько это кросс-браузер; В IE6 есть проблема, из-за которой имя функции просачивается во внешнюю область. Кроме того, arguments.callee устарел и может привести к ошибке при использовании
strict mode
.источник
Любой
constructor
выставляет свойствоname
, которое является именем функции. Выconstructor
получаете доступ через экземпляр (используяnew
) илиprototype
:источник
console.log
журналы вызововwindow
илиObject
для меня в зависимости от того, где я его запускаю, нетPerson
.Это выглядит как самая глупая вещь, которую я написал в своей жизни, но это смешно: D
d
глубина стека.0
- вернуть имя этой функции,1
- родитель и т. д .;[0 + d]
- просто для понимания - что происходит;firefoxMatch
- работает для сафари, но у меня было очень мало времени на тестирование, потому что владелец Mac вернулся после курения и отогнал меня: '(Тестирование:
Результат:
Chrome:
Fitefox:
Это решение создавалось только для удовольствия ! Не используйте его для реальных проектов. Это не зависит от спецификации ES, это зависит только от реализации браузера. После следующего обновления chrome / firefox / safari оно может быть повреждено.
Более того, при обработке ошибок (ха)
d
больше длины стека не будет - вы получите ошибку;Для других шаблонов сообщений об ошибках wrowsers - вы получите ошибку;
Он должен работать для классов ES6 (
.split('.').pop()
), но вы можете получить erorr;источник
Это может работать для вас:
Запуск foo () выдаст «foo» или undefined, если вы вызываете из анонимной функции.
Он также работает с конструкторами, в этом случае он будет выводить имя вызывающего конструктора (например, «Foo»).
Более подробная информация здесь: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Caller
Они утверждают, что он нестандартный, но также поддерживается всеми основными браузерами: Firefox, Safari, Chrome, Opera и IE.
источник
Ты не можешь Функции не имеют имен в соответствии со стандартом (хотя у mozilla есть такой атрибут) - их можно назначать только переменным с именами.
Также ваш комментарий:
находится внутри функции my.namespace.myFunc.getFn
Что вы можете сделать, это вернуть конструктор объекта, созданного новым
Так что вы могли бы сказать,
источник
Вы можете использовать это для браузеров, которые поддерживают Error.stack (возможно, не почти все)
конечно, это для текущей функции, но вы поняли идею.
счастливый пускать слюни, пока вы код
источник
Вы можете использовать
name
свойство, чтобы получить имя функции, если вы не используете анонимную функциюНапример:
Теперь давайте попробуем с именованной функцией
теперь вы можете использовать
источник
Вы можете использовать имя конструктора как:
этот код просто возвращает имя метода.
источник
как часть, как
ECMAScript 6
вы можете использовать метод Function.nameисточник
Вы можете использовать
Function.name
:В большинстве реализаций JavaScript, когда у вас есть ссылка на конструктор в области видимости, вы можете получить его строковое имя из свойства name (например, Function.name или Object.constructor.name
Вы можете использовать
Function.callee
:Нативный
arguments.caller
метод устарел, но большинство браузеров поддерживают егоFunction.caller
, что будет возвращать фактический вызывающий объект (его тело кода): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Функция / абонент? redirectlocale = EN-US и redirectslug = JavaScript% 2FReference% 2FGlobal_Objects% 2FFunction% 2FcallerВы можете создать исходную карту :
Если вам нужна буквальная сигнатура функции («имя»), а не сам объект, вам, возможно, придется прибегнуть к чему-то более индивидуальному, например, создать ссылку на массив значений строки API, которые вам понадобятся доступ часто. Вы можете отобразить их вместе, используя
Object.keys()
и ваш массив строк, или заглянуть в библиотеку исходных карт Mozilla на GitHub, для более крупных проектов: https://github.com/mozilla/source-map.источник
Я знаю, что это старый вопрос, но в последнее время я столкнулся с некоторой подобной проблемой, пытаясь украсить некоторые методы компонента React для целей отладки. Как уже говорили люди,
arguments.caller
иarguments.callee
они запрещены в строгом режиме, который, вероятно, включен по умолчанию в вашем транспаранте React. Вы можете либо отключить его, либо я смог придумать еще один хак, потому что в React все функции класса названы, вы можете сделать это:источник
Это сработало для меня.
Тестовый код:
источник
У меня была похожая проблема, и я решил ее следующим образом:
Этот код более удобным образом реализует один ответ, который я уже прочитал здесь, в начале этого обсуждения. Теперь у меня есть функция-член, получающая имя любого объекта функции. Вот полный сценарий ...
источник
Если я понял, что вы хотите сделать, это то, что я делаю внутри конструктора функции.
источник
Это будет работать в ES5, ES6, во всех браузерах и в строгом режиме.
Вот как это выглядит с именованной функцией.
Вот как это выглядит с анонимной функцией.
источник
at myName (<anonymous>:2:15)
Firefox:@debugger eval code:3:3
смотрите здесь: http://www.tek-tips.com/viewthread.cfm?qid=1209619
кажется, подходит для ваших нужд.
источник
Вы можете использовать Error.stack для отслеживания имени функции и точного положения, где вы находитесь в ней.
Смотрите stacktrace.js
источник
Простой способ получить имя функции из функционирующей вами функции.
источник
this
этого в принципе может быть все что угодно. попробуй(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()