Глобальные переменные в 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
}
Очевидно, что это уменьшенная версия моего кода, но она отражает то, как я работаю с глобальными переменными. Мой вопрос в том, есть ли более элегантный способ сделать это?
Спасибо
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