是否可以从函数返回一个const语句?

时间:2017-10-26 17:00:41

标签: javascript ecmascript-6

所以,如果我想停止为一个简单的可重复的东西编写许多const语句,是否可以创建一个函数或生成器或者让我在一行上写每个语句的东西?

示例常量:

const bgColor = theme('mode', {
  default: light.backgroundColor,
  dark: dark.backgroundColor,
});

const textColor = theme('mode', {
  default: light.color,
  dark: dark.color,
});

const shadowColor = theme('mode', {
  default: light.boxShadowColor,
  dark: dark.boxShadowColor,
});

示例所需声明:

themeProperty('bgColor', backgroundColor);
themeProperty('textColor', color);
themeProperty('shadowColor', boxShadowColor);

2 个答案:

答案 0 :(得分:2)

如此缩短代码似乎是一个问题。

缩短了两件事,第一件是重复的SCNView声明,确实可以通过使用解构赋值来消除。

因此,在我们继续前进之前,请先这样做。

const

当然,这是一个微小的改进,但它确实消除了const [bgColor, textColor, shadowColor] = [ theme('mode', { default: light.backgroundColor, dark: dark.backgroundColor, }), theme('mode', { default: light.color, dark: dark.color, }), theme('mode', { default: light.boxShadowColor, dark: dark.boxShadowColor, }) ]; 被输入的三次。

对于传递的对象,我不知道为什么const消失了,但我会重新添加它。你可以做的是创建一个目标属性到对象的地图,并提供应为每个提取的共同财产。

'mode'

然后创建一个从地图和属性名称创建新对象的函数。

const propObjMap = new Map([
  ["default", light],
  ["dark", dark],
]);

并像这样使用它:

function mToObj(map, prop) {
  const res = {};
  for (const [key, obj] of map.entries()) {
    res[key] = obj[prop];
  }
  return res;
}

然后因为还有一些重复,你可以创建另一个接收属性列表的函数,并返回一个数组进行解构。

const [bgColor, textColor, shadowColor] = [
  theme('mode', mToObj(propObjMap, "backgroundColor")),
  theme('mode', mToObj(propObjMap, "color")),
  theme('mode', mToObj(propObjMap, "boxShadowColor")),
];

所以现在你的function themes(...props) { return props.map(p => theme('mode', mToObj(propObjMap, p))); } 解构分配看起来像这样:

const

通过接收const [bgColor, textColor, shadowColor] = themes( "backgroundColor", "color", "boxShadowColor" ); 的参数作为参数,以及themes的参数,如果有其他映射,可以使'mode'函数更通用。

propObjMap

使通话看起来像这样:

function themes(m, map, ...props) {
  return props.map(p => theme(m, mToObj(map, p)));
}

答案 1 :(得分:1)

在Javascript中,它是一个特定的变量声明,用于确定它是否为const,而const功能仅适用于该特定的声明变量,而不适用于其内容。

因此,您无法从const的函数返回值。您必须将其分配给声明为const的变量。

const color = themeProperty(...);

在此,color是const,不是因为themeProperty()所做的任何事情,而是因为color变量的声明。

如果你那么:

const color = themeProperty(...);
let color2 = color;

然后,color2不是const

同样地,你在themeProperty()

内所做的事情并不重要
 function themeProperty() {
     // only this particular color variable is const
     const color = 'red';
     return color;        // returning it will not make the value const
 }

 let x = themeProperty();
 let y = x;
 x = 'blue';     // allowed because x is not const
 y = 'green';    // allowed because y is not const

因此,变量本身只是const,只能由它们的声明决定,而不是分配给其他变量的特定值。

变量的const - 无法传递给函数或从函数返回。最接近的解决方法是传入或返回一个冻结的对象(因此无法更改对象的属性)。但是,你不能冻结"传入或返回的单个值。