如何在JavaScript中不使用`window`来检查动态全局变量?

时间:2015-12-28 19:23:13

标签: javascript scope

我需要在JavaScript中传递一个变量名列表,并检查这些变量是否存在。我尝试了以下但是它似乎没有做到这一点(JSFiddle here):

var test1 = 'test1';
var test2 = 'test2';

function checkVariable(variableNameList) {
    for (var iterator = 0; iterator < variableNameList.length; iterator++) {
        var variableName = variableNameList[iterator];
        if (typeof window[variableName] === 'undefined') {
            alert('Variable ' + variableName + ' is not defined');
        } else {
            alert('Variable ' + variableName + ' is defined');          
        }
    }
}

checkVariable(['test1', 'test2', 'test3']);

我试图获得结果警报:

  1. 定义了变量test1。
  2. 定义了变量test2。
  3. 未定义变量test3。
  4. 使用下面的技巧似乎很容易修复,但有没有其他方法来实现这一目标?在window下声明全局变量是跟踪它们的唯一方法吗?

    window.test1 = 'test1';
    window.test2 = 'test2';
    

    有更好的方法可以做到这一点,还是这是正确的方法?

    香草JS只能回答。

1 个答案:

答案 0 :(得分:5)

它不起作用,因为变量不在全局范围内,它们在window.onload函数范围的范围内。

enter image description here

您的代码实际上是这样运行的:

window.addEventListener("load", function () {
    var test1 = 'test1';  /* these are not global because of */
    var test2 = 'test2';  /* running inside of window.onload */

    function checkVariable(variableNameList) {
    }

    checkVariable(['test1', 'test2', 'test3']);
});

将代码更改为在正文的头部或末尾运行。我将您的代码分叉到头部:https://jsfiddle.net/phrhxyzL/1/并获得您期望的结果。