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

Lor*_*uer 1 javascript variables scope get

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

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

JS 中有没有办法通过自实现的反射算法来获取变量的名称?

例如

var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;
Run Code Online (Sandbox Code Playgroud)

背景

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

替代品

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

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

nad*_*dan 5

可以使用对象反射,例如:

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


vol*_*ron 2

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"]
Run Code Online (Sandbox Code Playgroud)

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"]
Run Code Online (Sandbox Code Playgroud)

注意:两种方法都需要改进(例如递归、更好/更多的匹配模式)。第二个仅查看全局变量,而闭包中的某些变量可能不会暴露给全局命名空间。此外,还有对象的对象。