Установить переменную внутри 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. Все потому, что они стараются быть полезными только для того, чтобы вы имели в виду "=="... путем переноса назначения в скобки, это обычно обходит проверку, или, по крайней мере, останавливает выдачу предупреждений.