Сохранение информации о временной форме в глобальных переменных Javascript - PullRequest
2 голосов
/ 05 июля 2010

Есть ли причина, по которой я не должен делать что-то вроде следующего (чтобы не использовать скрытое поле для хранения временной информации)?Я использую синтаксис jQuery для краткости, но это общий вопрос JavaScript.

function editComments() {
    window.currentComments = $('#commentsTextBox').val();
    $('#commentsTextBox').removeAttr("readonly");
}

function cancelEditComments() {
    $('#commentsTextBox').val(window.currentComments);
    $('#commentsTextBox').attr("readonly", "readonly");
}

Я знаю, что глобальные переменные обычно считаются плохой практикой, но действительно ли есть какие-либо проблемы с выполнением вышеуказанного?* Пожалуйста, не отвечайте и не комментируйте «глобальные переменные - зло», если вы не можете дать причину / объяснение.

Ответы [ 3 ]

4 голосов
/ 05 июля 2010

Нет реальной проблемы с этим, за исключением того, что глобальные переменные являются злом.;)

Однако, если вы все равно используете jQuery, на мой взгляд, гораздо приятнее сохранить его в элементе, используя data():

function editComments() {
    $('#commentsTextBox').data("oldValue", $('#commentsTextBox').val());
    $('#commentsTextBox').removeAttr("readonly", "readonly");
}

function cancelEditComments() {
var oldValue = $('#commentsTextBox').data("oldValue");
$('#commentsTextBox').val(oldValue );
$('#commentsTextBox').attr("readonly", "readonly");
}

Пока вы держите его внутри скрипта, и с элементом ничего не делается, это должно работать нормально.

3 голосов
/ 05 июля 2010

Проблема с глобальными переменными в javascript (помимо других языков).В том, что нет механизма разрешения конфликтов имен (или, скорее, механизм просто предполагает, что это одна и та же переменная).Если вы используете глобальную переменную с именем currentComments, а также включаете какой-то другой модуль с глобальной переменной currentComments, то один из них потеряет, и вы можете получить непредсказуемые результаты.

Было бы лучшеиспользуйте тот, который ограничен вашим модулем, таким образом:

(function(){
    var currentComments;

    function editComments() {
        currentComments = $('#commentsTextBox').val();
        $('#commentsTextBox').removeAttr("readonly", "readonly");
    }

    function cancelEditComments() {
        $('#commentsTextBox').val(currentComments);
        $('#commentsTextBox').attr("readonly", "readonly");
    }
}());
1 голос
/ 05 июля 2010

Нет реальной причины не делать этого, если вы игнорируете аргумент «глобальные переменные плохие».

Одна вещь, о которой вам нужно знать, - вы не можете удалить свойства из объекта окнав IE это вызывает исключение.В вашем случае, поскольку это просто строка, это, вероятно, не имеет значения.

Это не работает в IE:

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