用子方法实现函数可以吗

Is it okay practice to have functions with sub methods?

本文关键字:函数 子方法 实现      更新时间:2023-09-26

这类东西在JavaScript 中有效

function main() {
    return 1;
}
main.sub = function () {
    return 2;
};
main();     // 1
main.sub(); // 2

并且似乎对做之类的事情很有用

function props() {
    return { color: props.color(), size: props.size() };
}
props.color = function () {
    // calculate and return color
};
props.size = function () {
    // calculate and return size
};

这样你就可以用prop()简单地拉入一个包含所有道具的对象,但如果你只需要一个,你可以直接调用它。这种设置可以吗?

尽管这是绝对合法的,但我认为这是对子方法的错误使用。它混淆了函数和所述函数的返回值。

我想说的是,当您想为函数添加元数据时,才可以正确使用函数中的子方法。假设您想为函数设置一个类似文档的属性,或者是否希望对其进行模糊处理。然后可以设置函数的属性,而不是基础对象。

尽管您的使用可能会节省一些写作,但它会使阅读代码变得更加困难。你应该一直努力做到易读性,而不是写作。

一般来说,这可能不是一个好的做法:

调用:props.color();将执行与调用props().color相同的操作。

更好的模式如下:

var props = function() {
 var theColor = function() {
  // calculate the color
 };
 var theSize = function() {
  // calculate the size
 };
 return {
  color: theColor(),
  size: theSize()
 }
}
var someprops = new props();

例如,你可以不把theColor()作为颜色的对象,而是把它作为函数:所以返回的是

return {
 color: theColor,
 size: theSize
}

不同之处在于props.color == "function",而在前面的例子中props.color将等于函数的结果。

这看起来很有用,但使用它时会发生什么并不明显。

表达式props.color()返回与类似的表达式props().color相同的属性,但性能不同,因为后者还计算其他属性,然后丢弃这些属性。很容易在没有注意到的情况下滥用该功能,因此您应该考虑使用一种方法,使用该方法可以更清楚地显示代码中实际发生的情况。