如何检查变量名是否“正在使用”?含义:如何检查变量名是否已在 var varname = 'something'
语句中使用?
通常,我会检查是否 typeof varname == 'undefined'
,这似乎工作正常。 问题是当页面上有一个带有 id="varname"
的元素时。现在,当我检查 typeof varname == 'undefined'
,无论如何我都会得到 false
,因为 varname
是一些 HTML 元素。
varname
不是“正在使用”,但它也不是 undefined
。
<body id="test1"></body>
<script>
//if <body> has an id of test1, how do i check if test1 is undeclared?
console.log(typeof test1 == 'undefined'); // the <body> element causes this to be true
console.log(typeof test2 == 'undefined'); // outputs true as expected
</script>
此外,您能否检查极端情况:var test1 = document.getElementById('test1')
是否已执行?
最佳答案
实现你所需要的唯一可能的方法是通过邪恶的 eval()
,因为不可能通过名称作为字符串来访问局部变量。 (全局变量可以使用 window["variableNameAsString"]
。)
下面给出的解决方案片段具有以下效果:
Returns
true
ifvarName
was declared and initialized (even if withnull
) and is readable from the current scope. Otherwise returnsfalse
.
来源:
function removeIdOfAllElementsWithId(id) {
var element, elementsFound = [];
while ((element = document.getElementById(id)) !== null) {
element.removeAttribute('id')
elementsFound.push(element);
}
return elementsFound;
}
function assignIdToElements(elements, id) {
for (var i = 0, n = elements.length; i < n; i++) { elements[i].id = id; }
}
var isDefinedEval = '(' +
function (isDefinedEvalVarname) {
var isDefinedEvalResult;
var isDefinedEvalElementsFound = removeIdOfAllElementsWithId(isDefinedEvalVarname);
try {
isDefinedEvalResult = eval('typeof '+isDefinedEvalVarname+' !== "undefined"');
} catch (e) {
isDefinedEvalResult = false;
}
assignIdToElements(isDefinedEvalElementsFound, isDefinedEvalVarname);
return isDefinedEvalResult;
}
+ ')';
用法:
测试是否定义了名称为 variableName
的变量:
eval(isDefinedEval + '("' + 'variableName' + '")') === true
检查是否未定义:
eval(isDefinedEval + '("' + 'variableName' + '")') === false
在 fiddle 中,您会发现许多单元测试演示和验证行为。
测试:
- fiddle 中包含几个测试;
- 此代码段已在 IE7、IE8 和 IE9 以及最新的 Chrome 和 Firefox 中进行了测试。
说明:
该函数必须通过 eval()
使用,因为它需要访问本地声明的变量。
要访问此类变量,必须在同一范围内声明一个函数。这就是 eval()
所做的:它在本地范围内声明函数,然后使用 varName
作为参数调用它。
除此之外,该功能基本上是:
- 删除每个具有 ID === varName
的元素的 ID 属性;
- 检查变量是否为 undefined
;
- 并重新分配那些删除了该属性的元素的 ID。
注意:这个答案经过大量编辑,一些评论可能不再适用。
关于javascript - 当 html 元素具有相同的 id 名称时,如何检查未声明的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16454283/