Отражение JavaScript: получение имени переменной? - PullRequest
1 голос
/ 22 октября 2011

У меня есть несколько переменных, которые назначены на одну и ту же функцию . Свойство name называется "", так как эта функция анонимна;

Также не задействован вызов функции, и, следовательно, нет вызываемого абонента.

Есть ли способ в JS получить имя переменной с помощью самореализованного алгоритма отражения?

1010 * например, *

var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;

Фон :

для эффективности использования пространства тысячи имен переменных присваиваются той же «статической» функции, что и ленивые загруженные пни, которые разрешаются в отдельные функции при первом вызове вызова. (Имя переменной также содержит пространство имен).

Альтернативы :

Моя альтернатива - использование таких объектов, как {_name: myUnknownNamedVar1 , _fn: x}

Решения этой проблемы были бы интересными. Особой проблемой является распознавание переменных с разными именами в скрипте, которые указывают на один и тот же объект.

Ответы [ 4 ]

3 голосов
/ 22 октября 2011

Нет. Там нет.

Простое объяснение (которое усиливает точку в посте) для этого просто: переменная (или свойство) равна , а не значение / объект Скорее, это «имя» для значения / объекта. Один и тот же объект может быть назван несколько раз.

Представьте себе этот пример и подумайте, как он отображается на «имена», данные людям: -)

var fred = function Fred () {}
fred.name // "Fred"

// An unknown number of nicknames can exist...
var francisco = fred
var frankyTheFiveFingers = fred
someOtherRegion.theGoodPerson = fred

// But sometimes nicknames are known; note that this is
// a locatable (e.g. "known") iterable set.
// (While properties can be iterated, variables cannot.
//  However, iterating *every* object is not feasible, hence
//  it must be a locatable set.)
fred.nicknames = ["Freddy", "FD"]

mary.nicknamesFor(fred) // who knows :-)     

Удачного кодирования.

2 голосов
/ 23 октября 2011

1.Вы можете попробовать выполнить синтаксический анализ текста сценария.

Пример JSFiddle

var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;

var txt  = (document.currentScript && document.currentScript.textContent) ||
           (document.scripts       && document.scripts[1]
                                   && document.scripts[1].textContent);
var arr  = txt.match(/var\s*(.*)\s*=\s*x\b/);
arr[1]   = arr[1].replace(/\s+$/,"");
var vars = arr[1].split(/\s*=\s*/);

// vars: ["myUnknownNamedVar1", "myUnknownNamedVar2"]

2.Вы можете попробовать сравнить значения

Пример JSFiddle

var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;

var vars = [];
for (var prop in window){
    if (window[prop] == x)
      vars.push(prop);
}

// vars: ["x", "myUnknownNamedVar1", "myUnknownNamedVar2"]

Примечание: Оба метода требуют уточнения (например, рекурсия, лучше / больше соответствует шаблонам).Второй рассматривает только глобальные переменные, в то время как некоторые переменные в замыканиях могут не отображаться в глобальном пространстве имен.Также есть объекты предметов.

1 голос
/ 23 апреля 2018

Можно использовать отражение объекта, как таковое:

const getVarName = obj => Object.keys(obj)[0];
const varToGetTheNameOf = "Value!";
getVarName({ varToGetTheNameOf }) // => "varToGetTheNameOf"
0 голосов
/ 03 февраля 2017

Вы можете использовать декораторы для определения имени переменной, которое должно быть:

(а) - класс

(b) - Атрибут класса или экземпляра

(c) - Метод класса или экземпляра


Декоратор предоставляет 3 информации о декорированных:

  1. цель
  2. ключ
  3. Дескриптор

Таким образом:

  • имя (а): target.name
  • имя (b) или (c) key напрямую

     function logName(target, key) {
       console.log(!key ? target.name : key);
     }
    

пример ( Попробуйте Fiddle ) :

  @logName
  class Person {

     @logName
     firstname="Someone";

     @logName
     fullName() {
       return this.firstname+' '+this.lastname;
     }

  }

Попробуйте Fiddle

...