Если вы делаете что-то вроде следующего:
var i = $('input[@name=some_field]');
if (i.val() != '' && !(i.val() >=1 && i.val() <= 36) || i.val() == 'OT')) {
i.focus();
}
i.val() достаточно быстр, чтобы использовать его несколько раз, или вам следует:
var value = i.val();
сначала, а затем используйте значение в операторе if, например:
var i = $('input[@name=some_field]');
var value = i.val();
if (value != '' && !(value >=1 && value <= 36) || value == 'OT')) {
i.focus();
}
...?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не снизите производительность при вызове jQuery val.
Это медленнее, чем собственный вызов .value DOM, поскольку вы несете дополнительные накладные расходы на дополнительный вызов функции, а также то, что происходит внутри функции - см. определение функции val здесь. Если вы не сделаете это сотни раз, вы этого не заметите.
Я бы выбрал какой-либо способ, который, по вашему мнению, более читабелен, и пошел бы с этим. Так или иначе, и придерживался бы его в своем коде! Лично я бы просто звонил val каждый раз, когда мне это нужно, и сохранял дополнительную строку назначения.
Это не обязательно вопрос jQuery, но он хорошо применим к большинству языков программирования. На самом деле, в этом вопросе гораздо больше, чем просто проблемы с производительностью.
Следует иметь в виду, что если вы сохраните значение, то нет никакой возможности, что оно изменится во время выполнения вашего последующего кода. В большинстве случаев это именно то, чего вы ожидаете и хотите. Но также возможно, что в некоторых случаях вызов val () вернет другое значение, особенно если вы зацикливаетесь и делаете что-то, что требует значительного времени.
В вашем конкретном примере шансы на то, что это произойдет, довольно низки, потому что это всего лишь несколько вызовов, а не конструкция цикла. Учитывая, что вызовов всего несколько, производительность здесь, скорее всего, не будет серьезной проблемой. Но суть теории остается неизменной - если вы хотите гарантировать, что значение не изменится, поместите его в переменную. Поскольку это также дает вам лучшие соображения по производительности, я думаю, что в большинстве случаев это будет лучшей практикой.
Разве код Javascript не выполняется в основном однопоточным, поэтому вероятность модификации в середине цикла фактически равна нулю?
В этом конкретном примере вы правы, но в цикле может быть код, который влияет на возвращаемое значение функции.
Если вы посмотрите код jQuery, вы увидите все, что происходит при выполнении функции val (), поэтому да, я предлагаю назначить ее переменной, не выполняя ее повторно.
Я не верю, что при вызове без каких-либо параметров val () будет значительно медленнее, чем простой доступ к свойству value напрямую. Основываясь на моем чтении исходного кода jQuery, по существу, все, что делает метод val (), проверяет, является ли элемент выбранным, а если нет, просто возвращает содержимое свойства value (с удаленными символами \ r). Из-за вызова функции будут некоторые накладные расходы и небольшие накладные расходы на замену строки, но ничто из того, что я прочитал, не указывает на то, что накладные расходы будут значительными.
Если вы действительно обеспокоены, попробуйте протестировать рассматриваемый код на большом количестве итераций. В противном случае просто выберите, какой метод кажется вам наиболее чистым, и действуйте.
В общем, я бы сказал, что никогда не вызывайте функцию более одного раза, чтобы получить одно и то же значение. Вы сделаете свой код более читабельным и эффективным, хотя бы за счет исключения накладных расходов на вызов функций.
Полностью согласен - очень хороший ответ!