Объявление глобальных переменных JavaScript

Следующий сценарий работает правильно, хотя мне нужно кое-что исправить. В каждой функции я получаю значения, необходимые для разных формул. Однако я склонен воспроизводить одну и ту же строку кода в разных функциях.

Ex.

function one(){ var v1= document.getElementById('one').value; }
function two(){ var v1= document.getElementById('one').value; }

Полный код

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


person Alessandro    schedule 08.11.2013    source источник
comment
Я не уверен, о чем вы спрашиваете. Вы спрашиваете, как создавать глобальные переменные?   -  person Smeegs    schedule 08.11.2013
comment
Лично я хотел бы объявить переменную для element и получить ее значение при необходимости. как var v1= document.getElementById('one'); и использовать как v1.value   -  person Satpal    schedule 08.11.2013
comment
Я в основном использую одно и то же значение переменной в разных функциях (например, v1 = document.getElementById ('one'). Value;), однако я хотел бы объявить все входные значения один раз, и они используют переменные в функциях   -  person Alessandro    schedule 08.11.2013


Ответы (3)


Ваш код будет очень трудно читать, если вы будете делать это как на скрипке.

Вместо этого сделай

var myVars;
window.onload=function() {
  myVars = { 
    'list_price': document.getElementById('list_price'),
    'negotiated': document.getElementById('negotiated'),
    .
    .
    'lease_payment': document.getElementById('lease_payment')
  }

теперь ты можешь сделать

var price = myVars.list_price.value;

или, возможно, добавить функцию

function getVal(id) {
  var val = document.getElementById(id).value;
  if (val =="" || isNaN(val)) return 0;
  return parsetInt(val,10); 
}

теперь ты можешь сделать

var price = getVal("list_price");
person mplungjan    schedule 08.11.2013
comment
Все это потрясающе, я люблю видеть разные решения. Спасибо - person Alessandro; 08.11.2013
comment
Небольшой комментарий, мне пришлось удалить .value из lease_payment, поскольку он возвращал бы undefined при таком вызове: var x4 = myVars.lease_payment.value. Вы бы почему? - person Alessandro; 08.11.2013
comment
У меня там неправильное значение. Удалено сейчас. Обратите внимание на отсутствие запятой после последнего элемента в объекте. - person mplungjan; 08.11.2013

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

(function(){
  // code goes here
}());
person Andy    schedule 08.11.2013

Есть два способа сделать это:

  1. Обновите переменную при изменении значения
  2. Используйте функцию, которая всегда возвращает правильное значение

1) Вы можете добавить слушателя для события change или события keyup, которое изменяет вашу глобальную переменную:

// save initial value
var val = document.getElementById('one').value;

// update the value when input is changed
addEventListener(document.getElementById('one'), 'change', function() {
  val = document.getElementById('one').value;
});

console.log(val);

2) Вы можете использовать функцию, которая всегда возвращает текущее значение:

var val = function() { return document.getElementById('one').value; };

console.log(val());

2b) Если вы ненавидите круглые скобки, вы можете определить свойство, которое использует указанную выше функцию в качестве получателя:

Object.defineProperty(window, 'one', {
  get : function() { return document.getElementById('one').value; }
});

console.log(one);
person Tibos    schedule 08.11.2013
comment
Что делать, если значение в поле ввода изменилось, v1 и v2 по-прежнему будут давать старое значение, внимательно прочтите вопрос - person Voonic; 08.11.2013
comment
@shadow очень хороший момент, особенно то, что входные данные будут часто меняться, поскольку люди могут захотеть увидеть разные результаты (справа) на основе новых входных значений (слева) - person Alessandro; 08.11.2013