我正在尝试编写一个“for”循环,它将在HTML页面上打印出与“document”对象(write,getElementById等)相关联的属性。不是为了实用,只是出于学习目的。如果直接使用“document”对象,它可以正常工作,但如果我尝试使用具有值“document”的变量,它将无法工作。这是我的代码:
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
<script type="text/javascript">
function objProps() {
var myObj=prompt("Object?");
for (x in myObj) {
document.write(x + "<br />");
}
}
</script>
</head>
<body>
<button onclick="objProps()">Click me to see the properties of an object</button>
</body>
</html>
当我在提示符中键入“document”时,我只获取数值,但是如果我将for循环中的代码从“myObj”更改为“document”,它就会按预期工作。
任何帮助非常感谢。谢谢!
答案 0 :(得分:6)
当我输入&#34;文件&#34;在提示中,我只是获取数值
这是因为您在字符串上使用for-in
。 prompt
的返回值将是字符串"document"
,而不是文档对象。
如果要使用字符串名称来查找全局属性(document
是全局属性),可以通过window
global来实现,这是对全局对象的引用:
for (x in window[myObj])
仅适用于全局变量,仅适用于全局属性的全局变量(从ES2015开始,并非所有全局变量都成为全局对象的属性)。
值得注意的是,for-in
仅访问可枚举的属性。我不认为document
的各种属性是否需要可枚举,因此您的结果可能因浏览器而异。
您的代码正在成为The Horror of Implicit Globals 的牺牲品(披露:链接到我的贫血小博客)。记得声明你的变量。
答案 1 :(得分:2)
字符串"document"
不等于全局变量document
。如果您尝试使用变量名称访问全局变量,则可以使用括号表示法:
function objProps() {
// var myObj=prompt("Object?");
var myObj='document';
for (x in window[myObj]) {
document.write(x + "<br />");
}
}
objProps();
&#13;
答案 2 :(得分:0)
您可以使用[]命名法来使用提示符:
std::set<T, C A>