Есть ли разница между возвратом значения и выражением в 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. Это определяется спецификацией.

Другие вопросы по тегам