1

有人提到立即或自执行函数必须存储整个堆栈。这是真的吗...如果是这样,使用模块模式(基于立即函数)与普通函数之类的优缺点是什么?

函数本质上是私有的,但您可以返回想要公开的项目,因此它可以处理隐私。

我看到的主要区别是,您没有全局导入或确保开发人员(等等我)使用 new 的功能(或者它很复杂)的能力。

一般来说,当试图提供隐私和状态时,什么时候应该使用模块模式,什么时候应该只使用普通函数?

第二个问题是函数在与 new 一起使用时是否提供状态?

4

1 回答 1

2

任何因为内部存在对变量或函数的持久引用而持续存在的函数闭包会占用一定量的内存。在当今的计算机(甚至电话)中,除非您以某种方式重复它数千次,否则这种内存量通常是微不足道的。因此,使用语言特性来解决您的设计问题通常比担心内存量更重要。

当您说“整个堆栈”时,顶级自执行函数的调用堆栈非常小。除了被调用的一个函数之外,堆栈上真的没有其他任何东西。

函数也是对象。因此,当它与 一起使用时new,如果您为这些属性分配值,它会创建一个可以具有状态(它的属性)的新对象。这是在 javascript 中创建对象的主要方式之一。您可以调用一个函数并检查它的返回值,也可以使用它,new该函数用作新对象的构造函数。给定的功能通常设计为以一种方式或另一种方式使用,而不是两者兼而有之。

模块模式通常用于控制哪些变量是公共的,以及何时将它们公开以将它们放入使用很少顶级全局变量的结构化命名空间中。它不是您真正选择的东西,而不是自执行功能,因为它们并不能真正解决相同的问题。您可以在此处阅读有关模块模式的更多信息:http ://www.yuiblog.com/blog/2007/06/12/module-pattern/

您可以在此处阅读许多选项:http: //www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depthhttp://www.klauskomenda.com/code/javascript-programming -模式/

根据一个人试图解决的特定问题或特定设计问题来讨论给定技术的优点/缺点,而不是当你问的事情不是真的时,一般性地讨论哪个更好解决等价问题。

我所知道的受保护成员和私有成员(可以被入侵 javascript,但不是核心语言功能)的最佳参考是这个:http: //javascript.crockford.com/private.html。当你使用这种方法而不是语言的默认原型特性时,你正在做出权衡,但如果你真的需要它,你可以实现隐私。但是,您应该知道构建 javascript 时并没有考虑到私有或受保护的方法,因此为了获得这种级别的隐私,您正在使用一些关于如何编写代码的约定来获得它。

于 2012-05-20T00:38:43.917 回答