获取所有Javascript变量?

21

有没有一种方法让 JavaScript 检测到所有已分配的变量?例如,如果一个 JS 文件创建了一堆变量(在全局范围内),那么后续的文件是否可以获取所有变量而不知道它们的名称和哪些可能存在呢?

提前感谢 :)

编辑,问题第二部分:

如何获取这些变量的值?以下是我尝试过的内容:

根据评论建议,这是我最终得出的结果:

for (var name in this) {
    variables[name] = name;
    variables[name]=this[name]
}

我认为你需要在那里使用 variables[name]=this[name] - user181548
谢谢,我能够使用变量c来发出警报:alert(variables.c); - Matrym
6个回答

37
Flanagan的《JavaScript权威指南》在第653页给出了以下内容:
var variables = ""
for (var name in this)
    variables += name + "\n";

提供了一些额外的东西,可能来自浏览器,但它能够工作!谢谢 :) - Matrym
抱歉,你能帮我理解如何获取每个变量的值吗?我已经添加了代码来尝试。 - Matrym
“name”就像是“this”哈希表中的一个键。通过this[name]来获取对应的值。 - wombleton
谢谢wombleton。我真想将变量直接用作键/值哈希本身。如果仅使用“this”,那么这就是它吗? - Matrym
Matrym,假设你有一个对象:var obj = {key1: 'val1', key2: 'val2'};。你可以使用for循环,并在其中使用'console.log('key is:', name, ' and val is:', this[name])'。希望这能帮到你。 - Cody

4

对于Firefox,您可以查看DOM选项卡——这很容易,但不是您问题的答案。

Kinopiko的答案中提供的for in循环将起作用,但在IE中不起作用。下面链接的文章中有更多解释。

对于IE,请使用RuntimeObject

if(this.RuntimeObject){
    void function() {
        var ro = RuntimeObject(),
            results = [],
            prop;
        for(prop in ro) {
            results.push(prop);
        }
        alert("leaked:\n" + results.join("\n"));
    }();
}

另请参阅:


嗨,Garrett。我已经编辑了你的答案,为 RuntimeObject 示例添加了代码格式。 - Tim Down

1

这里有一个this变量。它是一个对象或数组,你可以简单地放置:

for(i in this) { //do something }

不幸的是,它将返回this对象下的所有内容


0

这将把所有变量输出到控制台,而无需自己读取变量。

var variables = ""
for (var name in this)
    variables += name + "\n";
console.log(variables)

/*
This could work too... but it's such a big unecessary code for something you could do in one line 
var split = variables.split("\n");
for (var i in split)
    console.log(split[i])
*/


0
如果您想将一个对象的值赋给另一个对象,有几种方法可以实现:

//Way 1st
const variables= { ...this };
// or (I don't know what's the difference ;) )
// Don't forget const variables= {};
Object.assign(variables, this);
// Yes. It's very easy. You just "copy" entries from this to variables. I want to note that you are not copying a link to this, namely ENTRY.

Or
// Way 2nd. If u need to do smth. with entries.
const variables= [];
for (const name of Object.keys(this)) {
  /*
    Doing smth........
  */
  variables[name] = this[name];
}

I want to note that this is not a way to collect all declared variables into an object (I am looking for this method myself). They are simply ways of copying the contents of one object into another.


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - mcky

-1

这个函数会将所有变量漂亮地打印出来,包括三层嵌套。使用 JSON.stringify() 可能有点过度,因为它不会展开返回对象的函数,而是显示 [Object object]。你可能想要异步或使用按钮调用该函数,因为它在处理时会停顿。

由于我没有添加任何内容来告诉它是对象还是数组,一些 {} 可能是数组或函数。也许有人可以重构我的脚本。

如果你想将其打印到一个 <div> 中,那么你需要将空格 更改为 &nbsp;,将换行符 \n 更改为 </br>

请注意,它排除了 windowdocumentselfframestopparentjQuery$

<textarea id="all-variables" readonly></textarea>

<script type="text/javascript">
(function() {
  function stringCheck(string) {
    return {
      window: true,
      document: true,
      self: true,
      frames: true,
      top: true,
      parent: true,
      jQuery: true,
      $: true
    }[string] || false
  }
  
  function printObject(o) {
    var output = '';
    for (var p in o) {
      output += '      '+ p + ': ' + o[p] + '\n';
    }
    return output;
  }

  const allVariables = document.getElementById('all-variables');

  for (var variable in this) {
    if (
      (
        (typeof this[variable] === 'object') || (typeof this[variable] === 'function')
      ) &&
      (this[variable] != (undefined || null)) &&
      (!stringCheck(variable))
    ) {
      allVariables.innerHTML += variable +': {\n';
      for (var secondVariable in this[variable]) {
        if (
          (
            (typeof this[variable][secondVariable] === 'object') || (typeof this[variable][secondVariable] === 'function')
          ) &&
          (this[variable][secondVariable] != (undefined || null))
        ) {
          allVariables.innerHTML += '  '+ secondVariable +': {\n';
          for (var thirdVariable in this[variable][secondVariable]) {
            if (
              (
                (typeof this[variable][secondVariable][thirdVariable] === 'object') || (typeof this[variable][secondVariable][thirdVariable] === 'function')
              ) &&
              (this[variable][secondVariable][thirdVariable] != (undefined || null))
            ) {
              if (this[variable][secondVariable][thirdVariable][0] != undefined) {
                allVariables.innerHTML += '    '+ thirdVariable +': {\n';
                for (var i = 0; i < this[variable][secondVariable][thirdVariable].length; i++) {
                  allVariables.innerHTML += printObject(this[variable][secondVariable][thirdVariable][i]);
                }
                allVariables.innerHTML += '    }\n';
              }
            } else {
              allVariables.innerHTML += '    '+ thirdVariable +': \''+ this[variable][secondVariable][thirdVariable] +'\'\n';
            }
          }
          allVariables.innerHTML += '  }\n';
        } else {
          allVariables.innerHTML += '  '+ secondVariable +': \''+ this[variable][secondVariable] +'\'\n';
        }
      }
      allVariables.innerHTML += '}\n';
    } else {
      allVariables.innerHTML += variable +
        (
          typeof this[variable] === 'string' ? ': \''+ this[variable].toString() +'\'' : ''
        ) +
      '\n';
    }
  }
})();
</script>

一个IIFE?在2023年?真的吗?这是有原因的,还是只是为了炫耀古老的知识?其次,我们有大量重复的代码(显然!)。第三,既然所有这些还不够糟糕,你决定用一个检查jQuery和$的方式来结束,因为你习惯了让jQuery为你处理繁重的JS工作,你认为它是内置的。第四,如果你在深入研究,缩进回答。HTML是你的朋友,尽管你似乎没有回报。我以后会写一篇完整的文章,因为这个空间不足以解释所有的废话。 - undefined
冷静点,伙计,这只是一个基本的例子,为了达到一个目的,生活中还有更多要担心的事情。我需要它用于运行 ECMAScript v5 的设备(网络浏览器使用基于 WebKit 的 NetFront,停留在 2010 年)。使用 IIFE 没有任何问题,在这种情况下,它封装了函数使其成为私有的。重复的代码是因为我想深入三层。对于那些使用 jQuery 和 $ 的人来说,我进行了检测(我不使用)。对于我使用的设备来说,缩进是可以的,你可以根据自己的需求进行修改。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接