Переменная, не доступная, когда инициализировано вне функции

Когда я использую код как это, он хорошо работает:

function removeWarning() {
    var systemStatus = document.getElementById("system-status");
    systemStatus.innerHTML = "";
}

function indicateInvalidUsername() {
    var systemStatus = document.getElementById("system-status");
    systemStatus.innerHTML = "Invalid username";
}

Однако, когда я затем хочу переместиться systemStatus чтобы быть глобальной переменной, это не работает:

var systemStatus = document.getElementById("system-status");

function removeWarning() {
    systemStatus.innerHTML = "";
}

function indicateInvalidUsername() {
    systemStatus.innerHTML = "Invalid username";
}

Что я, как предполагается, делаю здесь?

40
задан isherwood 6 April 2014 в 00:01
поделиться

5 ответов

Это действительно зависит от того, где расположен ваш код JavaScript.

Проблема, вероятно, вызвана тем, что DOM не загружена, когда выполняется строка

var systemStatus = document.getElementById("system-status");

. Вы можете попробовать вызвать это в событии onload, или, в идеале, использовать событие типа DOM ready из фреймворка JavaScript.

38
ответ дан 27 November 2019 в 01:31
поделиться
SELECT
    p1.SPID AS blockedSPID, p2.SPID AS blockingSPID, ...
FROM 
    master..sysprocesses p1
    JOIN
    master..sysprocesses p2 ON p1.blocked = p2.spid

Remus: Монитор активности может истекать при загрузке сервера с ошибкой 1222

В MS KB 224453 имеется много хорошего

-121--3842506-

Здесь возникает проблема просто потому, что PHP сейчас интерпретирует ваш файл. Имеются вложенные функции.

Вот как в настоящее время выполняется ваш код:

function something() {
    $include_file = 'test.php';
    if ( file_exists($include_file) ) {
        //require_once ($include_file);

        $flag = 4;
        function test() {
           global $flag;

           echo '<br/>in test flag="'.$flag.'"';
           if ($flag) {
               echo 'flag works';
             //do something
           }
        }

        //end require_once ($include_file);

        test();
    }
}

something();

exit;

Как вы видите, при присвоении значения 4 $ flag ( $ flag = 4 ) вы находитесь в области действия функции что-то () ,

В test () , поскольку вы объявляете $ flag как глобальный в этой функции, $ flag является совершенно другой переменной, глобальной для всего сценария.

Чтобы избежать этой проблемы, используйте сверхглобальный $ GLOBALS . Это быстрее, чем использовать global , и это путь, что вы не смешиваетесь в области проблем, как выше:

function something() {
    $include_file = 'test.php';
    if ( file_exists($include_file) ) {
        //require_once ($include_file);

        $GLOBALS['flag'] = 4;
        function test() {
           global $flag;

           echo '<br/>in test flag="'.$GLOBALS['flag'].'"';
           if ($GLOBALS['flag']) {
               echo 'flag works';
             //do something
           }
        }

        //end require_once ($include_file);

        test();
    }
}

something();

echo $flag; //echos 4

exit;
-121--4746184-

Убедитесь, что вы объявляете переменную на «корневом» уровне, вне каких-либо блоков кода.

Вы также можете удалить var полностью, хотя это не рекомендуется и будет выдавать «строгое» предупреждение.

В соответствии с документацией в MDC можно установить глобальные переменные с помощью window.variablename .

27
ответ дан 27 November 2019 в 01:31
поделиться

Я предполагаю, что system-status объявляется после запуска объявления переменной. Таким образом, в момент объявления переменной для нее фактически устанавливается значение null?

Вы должны объявить только ее, а затем вместо этого назначить ее значение из обработчика onLoad , потому что тогда вы будете уверены, что он правильно инициализировал (загрузил) рассматриваемый элемент.

Вы также можете попробовать поместить сценарий внизу страницы (или хотя бы где-нибудь после объявления элемента system-status ), но это не гарантирует, что всегда будет работать.

6
ответ дан 27 November 2019 в 01:31
поделиться

Объявить systemStatus во внешней области и назначить его в обработчике загрузки.

systemStatus = null;

function onloadHandler(evt) {
    systemStatus = document.getElementById("....");
}

Или, если вам не нужен обработчик загрузки, поместите тег скрипта в конец HTML-кода.

6
ответ дан 27 November 2019 в 01:31
поделиться

Глобальную переменную лучше всего выразить во внешнем файле JavaScript:

var system_status;

Убедитесь, что эта переменная больше нигде не использовалась. Затем, чтобы получить доступ к переменной на вашей странице, просто укажите ее как таковую. Скажем, например, вы хотите заполнить результаты в текстовом поле,

document.getElementById("textbox1").value = system_status;

Чтобы убедиться, что объект существует, используйте функцию готовности документа jQuery.

Пример:

$(function() {
    $("#textbox1")[0].value = system_status;
});
2
ответ дан 27 November 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: