如何检查变量名称是否“正在使用”?含义:如何检查变量名是否已在var varname = 'something'
语句中使用?
通常情况下,我只会查看是否typeof varname == 'undefined'
,这似乎工作正常。 问题是页面上有一个元素id="varname"
。现在,当我检查typeof varname == 'undefined'
时,我得到false
,因为{{1}是一些HTML元素。
varname
不是“正在使用”,但它也不是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>
是否已执行?
答案 0 :(得分:6)
实现所需内容的唯一可能方法是通过邪恶的eval()
,因为无法通过名称作为字符串访问本地变量。 (使用window["variableNameAsString"]
可以实现全局。)
下面介绍的解决方案片段具有以下效果:
如果声明并初始化
true
,则返回varName
(即使null
)并且可从当前范围读取。否则返回false
。
<强> DEMO jsFiddle here. 强>
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
在小提琴中,你会发现很多单元测试证明并验证了这种行为。
该函数必须通过eval()
使用,因为它需要访问本地声明的变量。
要访问此类变量,必须在同一范围内声明函数。这就是eval()
所做的:它在本地范围内声明函数,然后以varName
作为参数调用它。
除此之外,功能基本上是:
- 删除具有ID === varName
的每个元素的ID属性;
- 检查变量是否为undefined
;
- 并重新分配它删除属性的那些元素的ID。
注意:这个答案经过大量编辑,有些内容可能仍然无法应用。
答案 1 :(得分:1)
不确定这是否是您要找的。 p>
if(typeof test1 == "undefined" && document.getElementById("test1") == null) {
//There is no element with an id="test1" and a variable test1
}
答案 2 :(得分:1)
在某些浏览器中除全局上下文之外的上下文中,除了使用try..catch
之外,不可能可靠地确定是否已定义变量(通过声明或以其他方式初始化)。
因此,这不是一个好的策略。
在全局环境中,在非IE浏览器中,您可以执行以下操作:
var global = this;
if (!global.hasOwnProperty('foo')) {
// there is no global foo
}
但是IE没有在全局对象上实现 hasOwnProperty 。请注意,DOM元素名称和ID不会覆盖声明的全局变量的值。
但无论如何,所有这些都是无用的,因为你可能有:
var foo = document.getElementById('foo');
现在怎么办?