2010-11-16 1 views
2

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

Спасибо, Эллиот Bonneville

Psuedocode моих функций:

function GetXML() {//this would be a function which reads in an XML file. 
        //Preferably it would also generate or set an object to hold the XML data. 
} 

function UseXMLData() { //I would use the XML data here. 
} 

function UseXMLDataHereAsWell() { //And here as well. 
} 
+2

Можете ли вы опубликовать пример того типа функций, о котором вы говорите? – casablanca

ответ

2

Лучшее решение для того, что вы пытаетесь сделать бы, чтобы обернуть все ваши данные в объект и сделать ваши функции будут методы на объекте:

function MyXMLClass() { 
    this.data = null; 
} 

MyXMLClass.prototype = { 
    GetXML: function() { 
    this.data = ...; 
    }, 

    UseXMLData: function() { 
    // use this.data 
    }, 

    /* etc. */ 
}; 

И тогда вы можете просто использовать его как это:

var x = new MyXMLClass(); 
x.GetXML(); 
x.UseXMLData(); 
... 
+0

Мог ли я просто использовать «MyXMLClass = новый объект»? (не уверен, что это правильный синтаксис) –

+1

@Elliot Bonneville: Если вам не нужен класс, но только один объект этого типа, да, вы можете сделать это следующим образом: 'var MyXMLObject = {data: null, GetXML : function() {...},/* и т. д. * /}; ' – casablanca

+0

А, спасибо, это действительно полезно. ;) –

1

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

+0

Итак, я слышал. Что бы я сделал вместо этого, и как бы реализовать его? –

2

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

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

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

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

EDIT: Вы должны создать класс XmlData.

Например:

function XmlData(...) { 
    this.data = ...; 
} 
XmlData.prototype.doSomething = function(...) { 
    //Use this.data 
} 

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

Here - хорошее объяснение.

+0

Я работаю с многоразовым сценарием, так что бы я сделал вместо этого? –

+0

Это зависит от того, что вы делаете. – SLaks

+0

Хорошо, позвольте мне привести пример. Подожди. –

1

Создайте пространство имен, поместите все свои функции в это пространство имен.

MyNS = { 
    x: 1, y: 2 // Here you define shared variables 
}; 

MyNS.func1 = function(){}; // Here you define your functions that need those variables 
+0

Это может сработать. Позвольте мне исследовать дальше. –

5

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

Существует множество способов свести к минимуму количество глобальных переменных, которые вы создаете в JavaScript. Один из способов - сохранить все переменные под одним объектом - это то, что делает jQuery (технически jQuery использует два - $ и jQuery.)

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

Дурной пример - загрязняют глобальное пространство имен ненужно:

var appleCount = 0; 

function addApple() { 
    appleCount = appleCount + 1; 
} 

function howManyApples() { 
    return appleCount; 
} 

addApple(); 
alert(howManyApples()); 

Лучше пример - только создает одну глобальную переменную:

var appleCounter = { 
    count: 0, 
    add: function() { 
    this.count = this.count + 1; 
    }, 
    howMany: function() { 
    return this.count; 
    } 
}; 

appleCounter.add(); 
alert(appleCounter.howMany()); 

Лучший пример - не создает никаких глобальных переменных:

(function(){ 
    var appleCounter = { 
    count: 0, 
    add: function() { 
     this.count = this.count + 1; 
    }, 
    howMany: function() { 
     return this.count; 
    } 
    }; 

    appleCounter.add(); 
    alert(appleCounter.howMany()); 
})(); 
Смежные вопросы