JavaScript反射:获取变量';她叫什么名字?

JavaScript反射:获取变量';她叫什么名字?,javascript,variables,get,scope,Javascript,Variables,Get,Scope,我有几个变量分配给同一个函数。属性“name”为“”,因为此函数是匿名的 也没有涉及函数调用,因此没有被调用方 在JS中有没有一种方法可以通过自我实现的反射算法获得变量的名称 例如 var x = function(){} var myUnknownNamedVar1 = myUnknownNamedVar2 = x; 背景: 为了节省空间,数千个变量名被分配给与延迟加载的树桩相同的“静态”函数,这些树桩在第一次调用时被解析为单个函数。(变量名还包含名称空间) 备选方案: 我的选择是使用对象,

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

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

在JS中有没有一种方法可以通过自我实现的反射算法获得变量的名称

例如

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

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

备选方案

我的选择是使用对象,例如
{{u name:myUnknownNamedVar1,{u fn:x}

这一问题的解决方案将是有趣的。一个特别的问题是识别脚本中指向同一对象的具有不同名称的变量。

否。没有

对此,一个简单的解释(强调文章中的观点)很简单:变量(或属性)不是值/对象。相反,它是值/对象的“名称”。同一对象可以多次命名

想象这个例子,并考虑它如何映射到“名字”给人:-(<)/P> 快乐编码。

不,没有

对此,一个简单的解释(强调文章中的观点)很简单:变量(或属性)不是值/对象。相反,它是值/对象的“名称”。同一对象可以多次命名

想象这个例子,并考虑它如何映射到“名字”给人:-(<)/P> 快乐的编码。

1。您可以尝试解析脚本的文本。


2.您可以尝试比较值


注意:这两种方法都需要改进(例如递归、更好的/更多的匹配模式)。第二种方法只关注全局变量,而闭包中的一些变量可能不暴露于全局名称空间。还有对象的对象。

1。您可以尝试解析脚本的文本。


2.您可以尝试比较值



注意:这两种方法都需要改进(例如递归、更好的/更多的匹配模式)。第二种方法只关注全局变量,而闭包中的一些变量可能不暴露于全局名称空间。此外,还有对象的对象。

您可以使用装饰器检测变量的名称,该名称必须是:

(a) -等级

(b) -类或实例的属性

(c) -类或实例的方法


装饰者提供了有关装饰对象的3个信息:

  • 目标
  • 钥匙
  • 描述符
  • 因此:

    • (a)的名称为
      target.name
    • (b)或(c)的名称直接为
      key

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

      @logName
      class Person {
    
         @logName
         firstname="Someone";
    
         @logName
         fullName() {
           return this.firstname+' '+this.lastname;
         }
    
      }
    

    您可以使用装饰器检测变量的名称,该变量必须是:

    (a) -等级

    (b) -类或实例的属性

    (c) -类或实例的方法


    装饰者提供了有关装饰对象的3个信息:

  • 目标
  • 钥匙
  • 描述符
  • 因此:

    • (a)的名称为
      target.name
    • (b)或(c)的名称直接为
      key

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

      @logName
      class Person {
    
         @logName
         firstname="Someone";
    
         @logName
         fullName() {
           return this.firstname+' '+this.lastname;
         }
    
      }
    

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

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

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

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

    我不知道你在问什么。您希望找到指向
    x
    ?fnmap.remoteNotYetMappedFunc(1,2,3,4)1的变量的字符串名称。将参数存储在队列2中。加载远程信息并创建单个函数,然后将其重新分配给fnmap.RemoteNotYetMappedBunch如果您的问题是能否获得指向对象的变量名称,答案是否。如果您的场景不同(例如,您可以迭代命名空间并检查引用),则可能,但我不明白你的任何解释。如果我理解正确,请告诉我。我贴了一个答案。我不知道你在问什么。您希望找到指向
    x
    ?fnmap.remoteNotYetMappedFunc(1,2,3,4)1的变量的字符串名称。将参数存储在队列2中。加载远程信息并创建单个函数,然后将其重新分配给fnmap.RemoteNotYetMappedBunch如果您的问题是能否获得指向对象的变量名称,答案是否。如果您的场景不同(例如,您可以迭代命名空间并检查引用),则可能,但我不明白你的任何解释。如果我理解正确,请告诉我。我发布了一个答案。很好,是的,例如通过代码成形/反射。一些直接的诡计会很好。我将使用单独的调用委派闭包,并承担轻微的加载时间和内存开销。顺便说一句,谢谢。是的,例如,通过代码成形/反射。一些直接的诡计会很好。我将使用单独的调用委派闭包,并承担轻微的加载时间和内存开销。顺便说一句,谢谢。这是一个创造性的解决方案,尽管不是很强大。首先,它只匹配
    var
    ed和定义的变量。所以如果我做了
    var a
    后来做了作业,但它不接。它也不会选择其他赋值方法,如返回值或简单的
    a=x;b=a等等。它也有点太贪婪了,它匹配的比它应该匹配的要多,因为
    *
    它也很容易被字符串文字愚弄。正则表达式绝对不足以解析语言,更不用说分析它了。一个“反射”解决方案。干得好(PS:currentScript是非标准/壁虎引擎)。你能让这个跨浏览器兼容吗?我接受你的答案。)@davin:你说得对