7

如何检查变量名称是否“正在使用”?含义:如何检查变量名是否已在var varname = 'something'语句中使用?

通常,我只会检查 if 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')已执行?

4

3 回答 3

6

实现你需要的唯一可能的方法是通过 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。

注意:此答案经过大量编辑,某些评论可能仍然不适用。

于 2013-05-09T05:06:17.567 回答
1

不确定这是否是您要找的。

if(typeof test1 == "undefined" && document.getElementById("test1") == null) {
//There is no element with an id="test1" and a variable test1
}
于 2013-05-09T04:23:06.193 回答
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');

现在怎么办?

于 2013-05-09T05:08:51.077 回答