在Github上查看CoffeeScript的源代码时,我注意到大多数(如果不是全部)模块定义如下:
(function() {
...
}).call(this);
这种模式看起来像是将整个模块包装在一个匿名函数中并调用自身。
这种方法的优点(和缺点)是什么?还有其他方法可以实现相同的目标吗?
Harmen的答案是相当不错的,但让我详细说明一下CoffeeScript编译器在何处完成此操作以及原因。
当您使用编译内容时coffee -c foo.coffee
,总会得到foo.js
如下所示的内容:
(function() {
...
}).call(this);
这是为什么?好吧,假设您输入了
x = 'stringy string'
在中foo.coffee
。看到这种情况时,编译器会问:x
该范围或外部范围中是否已经存在?如果不是,它将var x
在JavaScript输出中的该范围的顶部放置一个声明。
现在假设你写
x = 42
在中bar.coffee
,同时进行编译和连接foo.js
以bar.js
进行部署。你会得到
(function() {
var x;
x = 'stringy string';
...
}).call(this);
(function() {
var x;
x = 42;
...
}).call(this);
因此x
in foo.coffee
和x
in bar.coffee
完全相互隔离。这是CoffeeScript的重要组成部分:
除非明确导出 (通过附加到共享的全局文件或exports
Node.js中), 否则变量从一个.coffee文件不会泄漏到另一个文件 。
您可以通过使用-b
(“ bare”)标志来覆盖它coffee
,但这仅应在非常特殊的情况下使用。如果您在上面的示例中使用了它,则输出将是
var x;
x = 'stringy string';
...
var x;
x = 42;
...
这可能会带来可怕的后果。为了测试这个自己,尝试添加setTimeout (-> alert x), 1
在foo.coffee
。请注意,您不必自己连接两个JS文件-
如果您使用两个单独的<script>
标签将它们包含在页面中,它们仍然可以作为一个文件有效地运行。
通过隔离不同模块的作用域,CoffeeScript编译器使您不必担心项目中的不同文件是否可能使用相同的局部变量名称。这是JavaScript世界中的常见做法(例如,参见jQuery源或几乎所有jQuery插件),CoffeeScript会为您处理。
每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用——就如前面所提到的,当一个模块被第一次输入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的__name__属性完成。 使用模块的__name__ 例8.2 使用模块的__name__ #!/usr/bin/python
模块 模块是任何健壮的应用程序体系结构不可或缺的一部分,特点是有助于保持应用项目的代码单元既能清晰地分离又有组织。 在JavaScript中,实现模块有几个选项,他们包括: 模块化模式 对象表示法 AMD模块 CommonJS 模块 ECMAScript Harmony 模块 我们在书中后面的现代模块化JavaScript设计模式章节中将探讨这些选项中的最后三个。 模块化模式是基于对象的文字部分,
在过去,我使用了揭示模块模式。 在ES6中,通过对象速记改进了这一点。 现在有了内置的模块语法,我很难找到与上面最相似的首选模式。 选项#1命名导出 选项#2带分解结构的默认导出/导入 选项#3默认导出/导入与名称行间距 我喜欢带有命名导出的选项#1,因为它在“destructuring”导入语法中提供了简单性。 我还想继续在导出对象的导出文件底部显式定义模块的导出API。 我一直在读默认导出是首
问题内容: 我最近正在读《 学习JavaScript设计模式》 这本书。我没有得到的是模块模式和显示模块模式之间的区别。我觉得他们是同一回事。有人可以举一个例子吗? 问题答案: 至少有三种不同的方法来实现模块模式,但是显示模块模式是唯一具有正式名称的模块模式后代。 基本模块模式 模块模式必须满足以下条件: 私有成员住在封闭中。 公共成员暴露在返回对象中。 但是这个定义有很多歧义。通过以不同方式解决
author: Wuxiaolong 在Python中有一些内置的数据类型,比如int, str, list, tuple, dict等。Python的collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:namedtuple, defaultdict, deque, Counter, OrderedDict等,其中defaultdict和namedtuple是两个很实用
创建你自己的模块是十分简单的,你一直在这样做!每个Python程序也是一个模块。你已经确保它具有.py扩展名了。下面这个例子将会使它更加清晰。 创建你自己的模块 例8.3 如何创建你自己的模块 #!/usr/bin/python # Filename: mymodule.py defsayhi(): print'Hi, this is mymodule speaking.' version