有人提到立即或自动执行的函数必须存储整个堆栈。这是真的......如果是这样的话,使用模块模式(基于立即函数)和普通函数之类的利弊是什么?
一个功能本质上是私有的,但你可以返回你想要公开的项目,这样它就可以处理隐私。
我看到的主要区别在于,您没有全局导入或确保开发人员(等待我)在功能中使用new(或者很复杂)。
一般情况下,当试图提供隐私和状态时应该使用模块模式何时应该使用普通函数?
第二个问题是函数在与new一起使用时是否提供状态?
答案 0 :(得分:2)
任何持久存在的函数闭包,因为对其中的变量或函数有持久的引用会占用一些内存。在今天的计算机(甚至手机)中,除非你以某种方式重复数千次,否则这些内存量通常是微不足道的。因此,使用语言功能来解决您的设计问题通常比担心这些内存量更重要。
当你说“整个堆栈”时,顶级自执行函数的调用堆栈非常小。除了被调用的一个函数之外,堆栈上除了其他内容之外别无其他。
函数也是一个对象。因此,当它与new
一起使用时,如果为这些属性赋值,它会创建一个可以具有状态(它的属性)的新对象。这是在javascript中创建对象的主要方式之一。您可以调用函数并检查它的返回值,也可以将它与new
一起使用,该函数用作新对象的构造函数。给定的函数通常被设计为以某种方式使用,而不是两者都使用。
模块模式通常用于控制哪些变量是公共的,以及何时将它们公开以将它们放入使用极少数顶级全局变量的结构化命名空间中。这不是你选择的东西而不是自动执行的功能,因为它们并没有真正解决同样的问题。您可以在此处详细了解模块模式:http://www.yuiblog.com/blog/2007/06/12/module-pattern/
您可以在此处阅读许多选项:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth和http://www.klauskomenda.com/code/javascript-programming-patterns/。
根据一个人试图解决的具体问题或特定的设计问题而不是一般性的讨论,当你问到的事情更好时讨论给定技术的优缺点会更容易并没有真正解决同等问题。
我所知道的受保护和私有成员的最佳参考(可以入侵javascript,但不是核心语言功能)就是这个:http://javascript.crockford.com/private.html。当您使用此方法而不是语言的默认原型功能时,您正在进行权衡,但如果您真的需要它,您可以实现隐私。但是,您应该知道javascript不是使用私有或受保护的方法构建的,因此为了获得该级别的隐私,您正在使用一些关于如何编写代码的约定来实现它。