в чем проблема при замене переменной ? js

186
09 марта 2019, 09:30

Всегда выводит 2 почему ?

var a = 1; 
var b = 1 + a; 
 
function test() { 
  a = 2 
  console.log(b) 
  return a 
} 
 
test() 
 
console.log(b)

Answer 1

Хотя ожидаемый вами подход теоретически имеет право на существование (подобным образом ведут себя, например, формулы в ячейках Excel), большинство современных языков программирования устроены не так.

Переменная, образно говоря, просто хранит в себе кусок данных. Переменная ничего не знает про формулу, которая этот кусок данных вычисляет. Когда вы пишете b = 1 + a, вычисляется значение справа от знака = — это будет 2, а дальше это число 2 помещается в переменную b. Всё! В переменной b лежит число 2, и до тех пор, пока кто-нибудь не напишет b = ... ещё раз — эта двойка никуда не денется. Переменная b ничего не знает про 1 + a — оно вычислилось один раз во время работы этой строчки, и всё. Следовательно, когда вы напишете a = 2, в переменной b так и останется лежать двойка, а тройка там ниоткуда не появится, пока вы сами не запихнёте её туда.

Вычисление нового значения — это выполнение какого-то кода. После изменения переменной a вам нужно как-то явно запустить код, который вычислит новое значение. Способ «в лоб» — просто повторить этот код после изменения переменной a:

function test() {
  a = 2
  b = 1 + a
  console.log(b)  // Теперь будет 3
  return a
}

Очевидно, что это решение не всегда удобно. Как более удобный вариант можно просто избавиться от переменной b и использовать вместо неё функцию — при каждом вызове функции будет каждый раз выполняться код, вычисляющий новое значение:

var a = 1;
function b() {
    return 1 + a;
}
function test() {
  a = 2
  console.log(b())  // Будет 3
  return a
}
console.log(b())  // Будет 2
test()
console.log(b())  // Будет 3

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

var a = 1;
function b() {
    return 1 + a;
}
function test() {
  a = 2
  console.log(b())  // Будет 3
  return a
}
var old_b = b();  // Сохраняем результат вычисления в переменную
console.log(b())  // Будет 2
console.log(old_b)  // Будет тоже 2
test()
console.log(b())  // Будет 3
console.log(old_b)  // Будет 2, потому что переменную old_b никто не изменял
Answer 2

Проблемы нет: значение переменной b присваивается один раз.

var b = 1 + a;

Так как дальше переменная не изменяется странно рассчитывать на разный результат вызова

console.log(b);
READ ALSO
Несколько кнопок с одинаковой функцией js?

Несколько кнопок с одинаковой функцией js?

Есть окно заказов за годПри нажатии на месяц открывается таблица заказов

196
Объединить элементы массива [дубликат]

Объединить элементы массива [дубликат]

На данный вопрос уже ответили:

152
Динамическое отображение типов в Grid в Extjs

Динамическое отображение типов в Grid в Extjs

У меня есть store со значениями, где хранятся типы данных и их обозначения с id и тд

139
Изменить span на input

Изменить span на input

Подскажите пожалуйста, есть код в котором по нажатию на span изменяется на input

136