Есть ли разница между возвратом значения и выражением в JavaScript?
Мой друг только что спросил меня, какое из следующих двух выражений будет лучшим выбором. Хотя я понимаю вопрос и, следовательно, определение "лучше", это потенциально вопрос мнения и, следовательно, не по теме; Я хотел понять, были ли веские аргументы в пользу одного из них.
var count = _.reduce(randomData, function(prefix, businessData){
return prefix + businessData.length;
}, 0);
return {
name: randomName,
pos: position[randomName],
count: count
};
или же
return {
name: randomName,
pos: position[randomName],
count:
_.reduce(randomData, function(prefix, businessData){
return prefix + businessData.length;
}, 0)
};
И другой коллега, и я были согласны с тем, что первый будет лучше, поскольку он более понятен, потенциально легче отладить и легче понять, но вне этого мы не можем оправдать свой выбор.
Есть ли причина, по которой кто-то предпочел бы возвращать значение, а не возвращать выражение?
1 ответ
Есть ли разница между возвратом значения и выражением в JavaScript?
Нет, вы возвращаете значение в любом случае. Точнее, из примеров кода вы присваиваете значение count
Свойство объекта вы возвращаете ссылку в любом случае.
Единственная разница в ваших примерах кода - это когда reduce
называется. В первом он вызывается до того, как начнется строительство возвращаемого вами объекта. Во-вторых, это называется во время строительства. Однако нет никакой разницы в том, что функция затем возвращает.
Есть ли причина, почему кто-то предпочел бы вернуть значение, а не возвращать выражение?
Поскольку первый ответ выше - "нет", единственные причины, по которым мы попадаем, или, по крайней мере, очень близко, в страну мнений.
Ближайшая объективная мера, которую я могу придумать, - одна из тех, на которые вы указали: Отладка. С первым вы можете легко увидеть count
перед построением и возвратом объекта. Со вторым это сложнее.
Более подробно об этом объекте создания объекта, на случай, если это было неожиданным: JavaScript определяет порядок запуска инициализаторов свойств в инициализаторе объекта: неудивительно, что они выполняются в порядке исходного кода. Так, например, если у нас есть этот код:
var num = 0;
function foo() {
return ++num;
}
var obj = {
a: foo(),
b: foo(),
c: foo()
};
... мы точно знаем, что ценность obj.a
это 1, obj.b
2, и obj.c
3. Это определяется спецификацией.