Установить переменную внутри val

Это, похоже, работает и действует, но есть ли какая-то причина, по которой я не должен этого делать? Он сохраняет мне строку кода и позволяет мне установить переменную и значение текстовой области.

$('#price').val(default_price = 2.9);

Это эквивалентно этому:

default_price = 2.9;
$('#price').val(default_price);

Ответ 1

Он внедряет код, делающий одну вещь внутри кода, делая что-то совершенно другое.

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

Технически это одно и то же. Когнитивно это не так.

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

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

Ответ 2

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

Основное беспокойство IMO заключается в том, была ли объявлена ​​переменная - вы не можете просто

$('#price').val(var default_price = 2.9); //nope

и если исходный код используется с еще не объявленной переменной, вы в конечном итоге загрязняете глобальную область. Однако, если переменная была объявлена, она вызывает следующий вопрос "почему она не была объявлена ​​с правильным значением по умолчанию". Альтернативно, магическое число может отличаться в зависимости от (неизвестного) условия:

if (/*whatever*/) {
  $('#price').val(default_price = 2.9);
} else {
  $('#price').val(default_price = 9522); //over 9000
}

Опять же, это стилистически плохой, поскольку установка значения #price должна выполняться вне условного (или switch):

if (/*whatever*/) {
  default_price = 2.9;
} else {
  default_price = 9522;
}
$('#price').val(default_price);

Может быть запутанный случай, когда переменная setter переопределяется, чтобы возвращать нечто отличное от назначенного значения, которое является немного сомнительной практикой, в первую очередь IMO.

Ответ 3

Я бы не использовал его так, как вы, поскольку я всегда предпочитаю, чтобы объекты сохраняли исключительные значения в виде коллекции, то есть:

var defaults = {
  "price" : 2.9
};

(Причина этого в том, что он более экспортируемый, более портативный и с JavaScript не существует способа правильно удалить переменную после ее создания, тогда как вы можете удалить столько ключей из объекта, сколько хотите)

Однако я использую то, что вы делаете совсем немного в if statements. Есть много кодеров, которые жаловались бы на это, но для меня, присваивая результат чего-либо var - то, что вы тогда проверяете на существование, - а затем использование в пределах того же if block имеет смысл, и в моем глаза приводят к более читаемому коду, поскольку все находится в той же области:

var view;

if ( (view = someClass.thatChecksAndLoads('a view')) ) {
  /// do something with the view
}

Приведенное выше хорошо подходит для ситуаций, когда у вас есть несколько способов добраться до вашего объекта view, например:

if ( (view = someClass.thatChecksAndLoads('a view')) ) {
  /// do something with the view
}
else if ( (view = anotherWay.toLoad('a view')) ) {
  /// do something here instead
}

В качестве побочного примечания - на всякий случай, когда кто-то задается вопросом - я не просто добавляю дополнительные скобки без причины в приведенном выше. Довольно много компиляторов JavaScript (и компиляторы ActionScript тоже) будут жаловаться/лог-ошибки, если у вас есть сингулярный '=' внутри оператора if. Все потому, что они стараются быть полезными только для того, чтобы вы имели в виду "=="... путем переноса назначения в скобки, это обычно обходит проверку, или, по крайней мере, останавливает выдачу предупреждений.