实现你需要的唯一可能的方法是通过 evil eval()
,因为不可能通过它们的名称作为字符串访问局部变量。(全局变量可以使用window["variableNameAsString"]
.)
下面给出的解决方案片段具有以下效果:
返回true
是否varName
已声明和初始化(即使使用null
)并且可以从当前范围读取。否则返回false
。
在这里演示 jsFiddle。
来源:
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
在小提琴中,您会发现许多单元测试演示和验证行为。
测试:
- 小提琴中包含了几个测试;
- 此代码段已在 IE7、IE8 和 IE9 以及最新的 Chrome 和 Firefox 中进行了测试。
解释:
该函数必须通过使用,eval()
因为它需要访问本地声明的变量。
要访问此类变量,必须在同一范围内声明函数。这就是eval()
那里的作用:它在本地范围内声明函数,然后将其varName
作为参数调用。
除此之外,该功能基本上是: - 删除每个具有 ID === 的元素的 ID 属性varName
;- 检查变量是否为undefined
; - 并重新分配它删除属性的那些元素的 ID。
注意:此答案经过大量编辑,某些评论可能仍然不适用。