'global' 数组的 javascript 作用域问题

标签 javascript arrays scope

我知道,我知道,不要使用全局变量。但这些年来,我将它们用于各种控制结构,它们对这个老式的模块化“我反对对象”的人来说效果很好。

我当前的问题与数组的“消失范围”有关,这些数组被声明为全局数组,稍后填充,然后从其他地方引用。我经常在我的主 html 页面上执行以下操作:

<...>
<script type="text/javascript" src="./js/arrayStuff.js"></script>
<script type="text/javascript" src="./js/printStuff.js"></script>    
<script type="text/javascript>

var gGlobalArray = new Array();

loadgGlobalArray();
printgGlobalArray();

</script>
</head>
<html>blah blah
</html>

然后我将在 arrayStuff.js 文件中使用类似这样的内容来创建一个大小事先未知的多维数组:

function loadgGlobalArray()
{
<...>
gGlobalArray[rawFileIndex] = new Array(9);
gGlobalArray[rawFileIndex][0] = currentPathIndex;
gGlobalArray[rawFileIndex][1] = currentCtlName;
gGlobalArray[rawFileIndex][2] = currentStepbounds;
<...>

在文件 printStuff,js 中,我可以引用不同的维度 OK:

<...>
buffer += "<td>"+gGlobalArray[i][7]+</td><td>+gGlobalArray[i][8]+</td>";
document.getElementByID('output').innerHTML = buffer;
<...>

现在我正在处理一个新的 .js 外部文件,这就是让我感到困惑的地方。有时我的老式全局数组会按我的预期工作,有时却不会。我知道 Javascript 数组实际上是对象,并且可以理解为什么 length 属性可能不可用,例如,但更重要的是,只要我离开常规调试,我的数组就会按预期运行外部文件中的警报。如果我注释掉所有警报,内部数组信息就会消失,长度属性也会消失,等等。如果我在填充数组的位中放置一个警报语句,即使警报没有引用数组本身,信息被保留。为什么?

最佳答案

没有理由不提供长度,假设您确实像您那样定义了数组。也许发生了其他事情,例如您在加载另一个文件之前在一个文件中引用它,或者其他事情。警报可能会导致暂停,让内容加载。

顺便说一句,您应该查看对象和数组文字表示法:

gGlobalArray[rawFileIndex] = new Array(9);
gGlobalArray[rawFileIndex][0] = currentPathIndex;
gGlobalArray[rawFileIndex][1] = currentCtlName;
gGlobalArray[rawFileIndex][2] = currentStepbounds;

可能是

gGlobalArray[rawFileIndex] = [
 currentPathIndex, currentCtlName, currentStepbounds...];

更短且更易于查看。

关于 'global' 数组的 javascript 作用域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4241644/

相关文章:

java - 允许将我自己的网站加载到 iframe 中

c++ - 如何在类中创建和使用指向未知数量结构数组的指针?

javascript - 访问对象属性中的变量

c - 如何在C中构造 "extend"?

javascript - 获取 Backbone.CollectionView 中当前拖动项的索引

javascript - 为什么 Webpack 文件加载器不触发 CSS url?

php - 将php数组从csv插入mysql

Python 生成器让我困惑

javascript - 是否有一个变量可以返回滚动条的总大小

php - 从维度数组计算相同日期值