我模仿了一个库并能够编写以下代码。这段代码创建了'c'
反对'a'
功能被分配。所以,打电话'a'
,我必须写c.a()
.
另外,我还可以为此添加更多功能'c'
目的。我想了解这段代码中发生了什么。它看起来不像普通的面向对象编程。这种类型的 JavaScript 编程叫什么?
var c = (function(c) {
if (c === undefined) {
c = {};
}
function a() {
alert(1);
}
c.a = a;
return c;
}(c));
这是一个模块模式。您会看到该模式的许多变体,因此了解真正发生的情况非常重要,而不能只是模仿一种。
这段代码的重点是完成一个对象c
(通常是您的全球图书馆)。您的应用程序中可能有许多类似的代码片段,所有构建片段c
,可能每个都在自己的文件中。
如果库对象c
,作为参数传递给函数,尚不存在(c === undefined
),就创建好了。这使得可以不依赖于执行顺序或预执行的文件。
作业的右侧部分是IIFE http://benalman.com/news/2010/11/immediately-invoked-function-expression/(立即调用函数表达式),即立即调用的函数。这种结构的优点是它创建了一个范围,其中变量(例如a
函数)可以在不污染外部(全局)范围的情况下声明。这里的要点是没有意义的a
无论如何都是外部化的,但模块通常依赖于几个内部(私有)函数和变量。
可能需要解释的细节:所有这些文件看起来像他们定义了一个新变量c
但这里没有问题,即使文件是串联的:var
如果新变量已经存在,则语句不会定义新变量(变量是为整个范围定义的,这里是全局的,甚至在声明点之前)。
另一种写法是
var c = c || {}; // ensure the c variable is defined, and initialize its value it if necessary
(function() { // let's use an IIFE to have a protected scope and not pollute the global one
function a() {
alert(1);
}
c.a = a; // let's augment c
})();
这可能更清楚
- 它明确地将这两个步骤分开(
c
初始化和c
使用 IIFE 完成)
- 它不取决于两个
c
同名变量
- 它不太冗长
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)