JavaScript反射:获取变量的名称?

时间:2011-10-22 19:09:21

标签: javascript variables get scope

我有几个变量分配给相同的函数。属性'name'是“”,因为此函数是匿名的;

也没有涉及函数调用,因此没有被调用者。

JS是否有办法通过自我实现的反射算法获取变量的名称?

e.g。

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

背景

为了提高空间效率,数千个变量名称被分配给与延迟加载的树桩相同的“静态”功能,这些树桩在第一次调用时被解析为单个函数。 (变量名称还包含名称空间)。

替代方案

我的替代方案是使用诸如{_name: myUnknownNamedVar1 , _fn: x}

之类的对象

这个问题的解决方案很有意思。一个特殊的问题是在脚本中辨别具有不同名称的变量,这些变量指向同一个对象。

4 个答案:

答案 0 :(得分:3)

没有。没有。

一个简单的解释(强调帖子中的要点)就是:变量(或属性)值/对象。相反,它是值/对象的“名称”。同一个对象可以多次命名。

想象一下这个例子,并考虑它如何映射给人们的“名字”: - )

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 :-)     

快乐的编码。

答案 1 :(得分:2)

答案 2 :(得分:1)

可以使用对象反射:

const getVarName = obj => Object.keys(obj)[0];
const varToGetTheNameOf = "Value!";
getVarName({ varToGetTheNameOf }) // => "varToGetTheNameOf"

答案 3 :(得分:0)

您可以使用装饰器来检测必须为的变量名称:

(a) - 班级

(b) - 类或实例的属性

(c) - 类或实例的方法

装饰器提供有关装饰的3个信息:

  1. 描述符
  2. 因此:

    • (a)的名称是<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/splash_screen_bg"/> <item> <bitmap android:gravity="center" android:tileMode="disabled" android:src="@drawable/ic_launcher"/> </item> <item> <ProgressBar android:id="@+id/progressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </item> </layer-list>
    • (b)或(c)的名称直接为target.name

      key

    示例(Try Fiddle

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

    Try Fiddle