我有几个变量分配给相同的函数。属性'name'是“”,因为此函数是匿名的;
也没有涉及函数调用,因此没有被调用者。
JS是否有办法通过自我实现的反射算法获取变量的名称?
e.g。
var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;
背景:
为了提高空间效率,数千个变量名称被分配给与延迟加载的树桩相同的“静态”功能,这些树桩在第一次调用时被解析为单个函数。 (变量名称还包含名称空间)。
替代方案:
我的替代方案是使用诸如{_name: myUnknownNamedVar1 , _fn: x}
这个问题的解决方案很有意思。一个特殊的问题是在脚本中辨别具有不同名称的变量,这些变量指向同一个对象。
答案 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个信息:
因此:
<?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);
}