#javascript #html
#javascript #HTML
Вопрос:
Я экспериментирую со своим очень простым Javascript, и я нашел хороший учебник о том, как создать очень простой калькулятор на JS.
Я попытался следовать вместе с видео, но я не хотел просто «копировать-вставлять» то, что он писал, поэтому я остановился и попытался сделать то, что я считал логическим кодом … НЕПРАВИЛЬНО!
Вот в чем проблема
Почему это не работает?
function addNum() {
let first = document.querySelector('.first').value;
let second = document.querySelector('.second').value;
let result = document.querySelector('.resultt').value;
return result = first second
}
Я попытался присвоить входные данные, связанные с результатом, переменной, но это не сработало.
Но когда я делаю это: (как это было сделано в учебнике)
function addNum() {
let first = parseInt(document.querySelector('.first').value);
let second = parseInt(document.querySelector('.second').value);
document.querySelector('.resultt').value=first second;
}
Таким образом, он работает без присвоения результата переменной.
Почему?
Комментарии:
1. JavaScript использует семантику передачи по значению . en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value
2. @FelixKling — Просто придирчивый к терминологии. 🙂 передача по значению и передача по ссылке не имеют ничего общего с присвоением переменной. Это термины искусства, связанные с передачей аргументов в функции.
3. @T.J.Crowder: Я бы предположил, что применяется то же самое поведение (вообще говоря, я знаю, что это происходит в JavaScript)? Т.е. Язык, который использует передачу по значению, также будет делать это для простых назначений переменных. Но, возможно, нет…
4. @FelixKling — Понятно. 🙂 Но это действительно разные вещи. Например, в C #
a = b
всегда просто копируется значение изb
вa
(где «значение» — это либо примитив, либо ссылка на объект), но если вы переходитеb
в функцию, это может быть по значению (по умолчанию) или по ссылке (out
ref
параметр или). Но если они не добавили его недавно, в C # по-прежнему нет способа заставитьa = b
mean »a
ссылаться наb
(напримерamp;
, IIRC на C — но прошло много лет с тех пор, как я делал C 🙂 ).5. @T.J.Crowder: Спасибо 🙂
Ответ №1:
Когда вы делаете
let result = document.querySelector('.resultt').value;
вы копируете значение из value
свойства в result
переменную. После этого между ними нет постоянной связи, каждый из них просто содержит одну и ту же строку. Это означает, что позже, когда вы это сделаете result = first second
, все, что вы делаете, это обновление result
; это никак не влияет на value
.
Поэтому вам нужно назначить обратно value
, как вы делаете во втором блоке кода.
Комментарии:
1. Правильно ли было бы сказать, что в этом случае не должно быть переменной, при вводе которой пользователь ничего не получает от пользователя, как при вводе результата?
2. @marcomarco — Это полностью вопрос стиля. Вероятно, это относится к той же категории, что и то, должна ли функция выполнять
return a b;
илиconst result = a b; return resu<
большинство людей предпочитают первое, но последнее часто удобно для отладки (и они обрабатываются одинаково компилятором / движком JavaScript; в случае JavaScript, где размер исходного кода имеет значение, любой приличный минификатор справится с уменьшением этого).