проблема области видимости JavaScript с «глобальными» массивами - PullRequest
1 голос
/ 22 ноября 2010

Я знаю, я знаю, не используйте глобальные переменные. Но я использовал их для всех видов управляющих структур на протяжении многих лет, и они прекрасно работают для этого старого модульного парня «я возражаю против объектов».

Моя текущая проблема связана с «исчезающей областью действия» массивов, которые объявляются глобальными, заполняются позже, а затем на них ссылаются из других источников. На своей главной 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 может быть недоступно, но главное, что мои массивы ведут себя так, как задумано, до тех пор, пока я оставляю свои обычные предупреждения отладки. во внешних файлах. Если я закомментирую все предупреждения, информация о внутреннем массиве исчезнет, ​​свойство length исчезнет и т. Д. Если я добавлю один бит предупреждения в бит, где я заполняю массив, , даже если предупреждение не обратитесь к самому массиву , информация сохраняется. Почему?

1 Ответ

2 голосов
/ 22 ноября 2010

Нет причины, по которой длина не должна быть доступной, если вы действительно определили массив так, как вы это сделали.Возможно, что-то еще происходит, например, вы ссылаетесь на него в файле перед загрузкой другого файла или что-то в этом роде.Предупреждение может вызывать паузу, которая позволяет загружать вещи.

Кстати, вы должны рассмотреть буквенную запись объекта и массива:

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

может быть

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

Гораздо короче и на них проще смотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...