Каков наилучший способ сохранить значение для использования в более поздней функции?Я слышал, что глобальные переменные являются злом - PullRequest
4 голосов
/ 12 августа 2011

Итак, код, который я использую, равен http://jsfiddle.net/8j947/10/ и возвращает значение true или false для переменной isLive. Как я могу использовать переменную onLive в более поздней функции? Я прочитал ответы на Доступ к переменным из других функций без использования глобальных переменных , но у меня много проблем с тем, чтобы заставить его работать Все, что мне нужно, это сохранить значение true или false, чтобы я мог вызвать его в оператор if в более поздней функции. Кто-нибудь может дать мне самый простой способ сделать это? Есть ли способ сохранить данные как объект?

Ответы [ 7 ]

6 голосов
/ 12 августа 2011

Просто определите вашу переменную в той же области, в которой вы определяете функции, которые на нее полагаются.Если ваши функции находятся в глобальной области видимости, то ваша переменная должна быть такой.

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

Вперед, критики!Проголосуй за меня!И когда вы закончите с этим, посмотрите некоторые другие мои ответы, где я на самом деле рекомендую использовать таблицы в HTML!: -)

Иногда вам нужно понять правила, чтобы вы знали, когда можно их нарушать.

Теперь, если вы только сейчас поняли, что ваши функции находятся в глобальной области видимости,и вы хотите изменить это, просто оберните весь свой код в анонимную функцию и немедленно вызовите его:

(function(){
    var scopeLevelVariable = true;
    function scopeLevelFn(){
        ...
    }
    window.globallyAvailableVariable = "foo";
    window.globallyAvailableFunction = function(){
        ...
    };
})();
4 голосов
/ 12 августа 2011

Глобальные переменные считаются «злыми», потому что любая функция может непреднамеренно изменить вашу переменную, что может вызвать некоторые трудно отслеживаемые ошибки. Обычно это не проблема для простых проектов, но вы должны подумать об этом.

Чтобы сохранить значение без чрезмерного искажения глобального пространства имен и, таким образом, снизить риск вышеупомянутых ошибок, вы можете создать собственный объект «пространство имен» (вариант 2 принятого ответа в связанном вопросе). Вот так:

var MyPageData = {};

MyPageData.someProperty = someFunc();

// Later on...

function anotherFunc() {
    // Use the data you set...
    alert(MyPageData.someProperty);
}
1 голос
/ 12 августа 2011

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

Чтобы избежать коллизий с другими глобальными переменными (возможно, записанными во включенных библиотеках), я бы предложил принять две меры

1) Используйте анонимные функции (самовывоз), чтобы ваш код (и переменные) были отделены от другого кода

// other peoples/modules code
var myVariable = "whatever";

// anonymous function for your self contained code
(function(){
var myVariable = "inside closure";
alert(myVariable);
})() // the empty brackets envoke the anonymous function

// still retains value from before your self envoking anonymous function
alert(myVariable);

2) Используйте уникальное пространство имен - и сделайте все глобальные переменные, которые вы используете под этим одним объектом, чтобы избежать загрязнения

myUniqueNameSpaceRaiders = {};
// will not conflict with other global variables if your namespace is unique
myUniqueNameSpaceRaiders.desiredVariable = "something";

Я думаю, что если вы правильно организовали свои глобальные переменные, то их можно использовать. Надеюсь, это поможет.

0 голосов
/ 12 августа 2011

Попробуйте модульное программирование JavaScript.

Кроме того, замыкания полезны для хранения информации без предоставления ее глобальному пространству имен.

Если вам нужно использовать глобальное ... создайте свое собственное глобальное пространство имен и поместите в него все, что вам нужно. Это может быть хорошей отправной точкой для вас, когда вы решитесь на другие шаблоны javascript.

Ex.

//Global Namespace
window.ns = {};

ns.onLive = false;

if(ns.onLive === false) {
   ns.notLive = !ns.onLive;
}

//Closures
var hello = (function() {

  var onLive = true;

  my.fn1 = function () {
    return onLive;
  }

  my.fn2 = function () {
    return !onLive;
  }

  return my;
})();

hello.fn1(); //true;
hello.fn2(); //false
0 голосов
/ 12 августа 2011

Если вы работаете с определенным набором функций и данных, вы можете сделать что-то вроде этого:

var yahooInterface = new function(){
   var isLive = false;

   this.function1(){ isLive = true };
   this.function2(){ alert( isLive ) };
};

Таким образом, function1 и function2 обмениваются данными, но они не загрязняют пространство имен глобально.

Пример: http://jsfiddle.net/XpJFn/1/

0 голосов
/ 12 августа 2011

Вы должны взглянуть на localStorage: http://diveintohtml5.ep.io/storage.html

0 голосов
/ 12 августа 2011

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

getVariable = function(){
    return "Hello world!";
}

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

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