Глобальные переменные в Javascript (jQuery)



Таким образом, это первый раз, когда я использую Javascript в гораздо более мощном контексте, имея толстый клиент и выполняя большую часть тяжелой работы через javascript сам по себе. Я использую jQuery, и большая часть кода становится мутной в данный момент, потому что это всего лишь куча функций.



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

Например, у меня, вероятно, есть что-то вроде этого



var node = //init with some value;

$(document).ready(setup);
function setup()
{
A();
B();
}

function A()
{
// operate on var node
}

function B()
{
// operate on var node
}


Очевидно, что это уменьшенная версия моего кода, но она отражает то, как я работаю с глобальными переменными. Мой вопрос в том, есть ли более элегантный способ сделать это?



Спасибо

770   6  

6 ответов:

Любая причина, по которой вы не можете сделать:

$(document).ready(function() {
    var node = //init with some value;
    setup(node);

    function setup(node) {
        A(node);
        B(node);
    }

    function A(node) {
      // operate on var node
    }

    function B(node) {
      // operate on var node
    }
});
В целом, использование глобальных переменных и функций-плохая идея, и ее следует избегать везде, где это возможно.

Обратите внимание, что, хотя вы, кажется, спрашивали конкретно о node, ваши функции setup, A и B являются также всеми глобальными переменными в вашей версии.

Самым простым подходом было бы поместить все эти объявления в анонимную функцию:
$(document).ready(function() {

    var node = ...;

    function A() {
        ...
    }

    function B() {
        ...
    }

    function setup() {
        A();
        B();
    }

    setup();
});

Используйте только одну глобальную переменную (или как можно меньше). Сделайте любые функции или объекты членами одной глобальной переменной.

Дуглас Крокфорд говорит

Объективной мерой качества JavaScript-программы является то, как много ли у него глобальных переменных и глобальных функций? Большой число плохо, потому что вероятность плохих взаимодействий с другими программы идут вверх. В идеале-приложение, библиотека, компонент или виджет определяет только одну глобальную переменную. Эта переменная должна быть объект, который содержит и является корневым пространством имен для всех ваших материал.

Единственная глобальная компания Yahoo - это YAHOO. Он пишется во всех заглавных буквах, чтобы идентифицировать это как нечто особенное, так как все строчные буквы обычные и начальные caps указывает на конструктор. Находясь во всех шапках, вряд ли можно сказать, что кто-то использовал бы его случайно, что еще больше уменьшает вероятность того, что столкновение.

Http://www.yuiblog.com/blog/2006/06/01/global-domination/

Также можно создавать объекты для дальнейшей организации кода.

Глобальный.объект MyObject = {}; ГЛОБАЛЬНЫЙ.мой объект.myfunction в консоли = ...

Я предпочитаю шаблон "модуль раскрытия" :

var myApp = (function () {
    // privates
    var node;

    var a = function () {
        // operate on node
    };

    var b = function () {
        // operate on node
    };

    // publics
    var init = function () {
        // initialization stuff
        a();
        b();
    };

    return {
        init: init
    };
})();

$(document).ready(function () {
    myApp.init();
});

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

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

$(function(){
    var outcome = multiply(add(5));
});

function add(num)
{
    return num+1;
}

function multiply(num)
{
    return num*5;
}

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

Ie,

(function(){
    var a; // can be used in any functions within this closure, but not polluting window
    function A()
    {
        a = 'blah';
    }
})();

Их много. Например, объекты.

// jQuery shorthand for "wait till DOM ready"
$( function() {
   // create node object
   var node = {
      id: /* some value */,
      setup: function() {
         this.A();
         this.B();
      },
      A: function() {
         // operate on this.id
      },
      B: function() {
         // operate on this.id
      }
   };
   // setup node object
   node.setup();
} );

Глобальные переменные-это проблемы, которые ждут своего часа. Не пачкайте свое глобальное пространство имен. Javascript-это объектно-ориентированный язык, использующий объекты. Обратите внимание, что объект может иметь свойство, на которое можно ссылаться с помощью ключевого слова this из методов objects.

Comments

    Ничего не найдено.