如何检查变量名称是否"正在使用"?含义:如何检查变量名是否已在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>
Run Code Online (Sandbox Code Playgroud)
另外,你能检查角落情况:var test1 = document.getElementById('test1')已经执行了吗?
实现所需内容的唯一可能方法是通过邪恶eval(),因为无法通过名称作为字符串访问局部变量.(可以使用Globals window["variableNameAsString"].)
下面介绍的解决方案片段具有以下效果:
返回
trueifvarName声明和初始化(即使有null)并且可从当前范围读取.否则返回false.
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;
}
+ ')';
Run Code Online (Sandbox Code Playgroud)
要测试是否variableName定义了带名称的变量:
eval(isDefinedEval + '("' + 'variableName' + '")') === true
Run Code Online (Sandbox Code Playgroud)
要检查它是否未定义:
eval(isDefinedEval + '("' + 'variableName' + '")') === false
Run Code Online (Sandbox Code Playgroud)
在小提琴中,你会发现许多单元测试证明和验证行为.
必须使用该函数,eval()因为它需要访问本地声明的变量.
要访问此类变量,必须在同一范围内声明函数.这就是eval():它在本地范围内声明函数,然后使用varNameas参数调用它.
除此之外,该函数基本上: - 删除每个具有ID ===的元素的ID属性varName; - 检查变量是否undefined; - 并重新分配它删除属性的那些元素的ID.
注意:这个答案经过大量编辑,有些内容可能仍然不适用.