有没有一种方法让 JavaScript 检测到所有已分配的变量?例如,如果一个 JS 文件创建了一堆变量(在全局范围内),那么后续的文件是否可以获取所有变量而不知道它们的名称和哪些可能存在呢?
提前感谢 :)
编辑,问题第二部分:
如何获取这些变量的值?以下是我尝试过的内容:
根据评论建议,这是我最终得出的结果:
for (var name in this) {
variables[name] = name;
variables[name]=this[name]
}
有没有一种方法让 JavaScript 检测到所有已分配的变量?例如,如果一个 JS 文件创建了一堆变量(在全局范围内),那么后续的文件是否可以获取所有变量而不知道它们的名称和哪些可能存在呢?
提前感谢 :)
编辑,问题第二部分:
如何获取这些变量的值?以下是我尝试过的内容:
根据评论建议,这是我最终得出的结果:
for (var name in this) {
variables[name] = name;
variables[name]=this[name]
}
var variables = ""
for (var name in this)
variables += name + "\n";
对于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"));
}();
}
另请参阅:
RuntimeObject
示例添加了代码格式。 - Tim Down这里有一个this
变量。它是一个对象或数组,你可以简单地放置:
for(i in this) { //do something }
不幸的是,它将返回this
对象下的所有内容。
这将把所有变量输出到控制台,而无需自己读取变量。
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])
*/
//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.
// 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];
}
这个函数会将所有变量漂亮地打印出来,包括三层嵌套。使用 JSON.stringify()
可能有点过度,因为它不会展开返回对象的函数,而是显示 [Object object]
。你可能想要异步或使用按钮调用该函数,因为它在处理时会停顿。
由于我没有添加任何内容来告诉它是对象还是数组,一些 {}
可能是数组或函数。也许有人可以重构我的脚本。
如果你想将其打印到一个 <div>
中,那么你需要将空格
更改为
,将换行符 \n
更改为 </br>
。
请注意,它排除了 window、document、self、frames、top、parent、jQuery 和 $。
<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>
variables[name]=this[name]
。 - user181548