Javascript JS模块模式:为什么要在扩展中分配任务?

Javascript JS模块模式:为什么要在扩展中分配任务?,javascript,module-pattern,Javascript,Module Pattern,我看到很多代码,: 为什么存在var模块=零件?为什么返回模块如果不需要前一部分 我看到了以下用法: var module = (function(module) {...})(module || {}); 对于模块有时尚未定义的情况。。。是上述情况吗?要理解,重命名标识符以获得等效的标识符会有所帮助 var module = (function (module_impl) { module_impl.prototype.something_else = function () {

我看到很多代码,:

为什么存在
var模块=
零件?为什么
返回模块如果不需要前一部分

我看到了以下用法:

var module = (function(module) {...})(module || {});

对于
模块
有时尚未定义的情况。。。是上述情况吗?

要理解,重命名标识符以获得等效的标识符会有所帮助

var module = (function (module_impl) {
    module_impl.prototype.something_else = function () {
    };
    return module_impl;
})(module || {});
module_impl
是保存模块公共API的对象。因此,在填充它之后,匿名函数将其返回给调用者,调用者将其分配给全局
模块
。通过这种方式,现在可以使用
module
使用API,而任何实现细节都隐藏在匿名函数创建的闭包中

module | |{}
现在允许扩充:第一次调用它时,
module
仍然
未定义
,因为尚未对匿名函数的返回值赋值。因此,`module |{}的计算结果为第二个操作数

进一步说明为什么需要赋值。第一次调用存根时,它实际上与

var module = (function () {
    var module_impl = {};
     // ...
     return module_impl;
})());

为了理解这一点,重命名标识符有助于获得等效的标识符

var module = (function (module_impl) {
    module_impl.prototype.something_else = function () {
    };
    return module_impl;
})(module || {});
module_impl
是保存模块公共API的对象。因此,在填充它之后,匿名函数将其返回给调用者,调用者将其分配给全局
模块
。通过这种方式,现在可以使用
module
使用API,而任何实现细节都隐藏在匿名函数创建的闭包中

module | |{}
现在允许扩充:第一次调用它时,
module
仍然
未定义
,因为尚未对匿名函数的返回值赋值。因此,`module |{}的计算结果为第二个操作数

进一步说明为什么需要赋值。第一次调用存根时,它实际上与

var module = (function () {
    var module_impl = {};
     // ...
     return module_impl;
})());

此代码块仅在模块已定义且您希望扩展它(例如,添加新方法)时使用:

它接受
模块
作为输入参数,并返回扩展的
模块
。然后,
var模块=
的赋值将替换原来的
模块

逐一回答您的问题:

为什么var模块=存在零件

在上面的示例中(取自您的第一个URL),
var module=
不是必需的。他们提供的简单例子很愚蠢。您可以通过以下方式完成完全相同的任务:

module.prototype.something_else = function () {};
通过第二个URL()中提供的示例,使用上述模式扩展类更有意义:

立即执行函数创建了一个新的作用域,我们可以在其中保留旧方法
var old\u moduleMethod=my.moduleMethod

下一个问题:

为什么返回模块;如果不需要前一部分

您需要
返回模块
,因为否则函数将不会返回任何内容,
var module=
赋值将设置为未定义的值

下一个问题:

对于有时尚未定义模块的情况。。。是上述情况吗


是的,就是这样。如果未定义
模块
,则需要传入一个空对象。但是,如果一开始没有定义对象,通常会使用模式来扩展对象。这毫无意义,只会使代码复杂化。

此代码块仅在模块已定义且您希望扩展它时使用(例如,添加新方法):

它接受
模块
作为输入参数,并返回扩展的
模块
。然后,
var模块=
的赋值将替换原来的
模块

逐一回答您的问题:

为什么var模块=存在零件

在上面的示例中(取自您的第一个URL),
var module=
不是必需的。他们提供的简单例子很愚蠢。您可以通过以下方式完成完全相同的任务:

module.prototype.something_else = function () {};
通过第二个URL()中提供的示例,使用上述模式扩展类更有意义:

立即执行函数创建了一个新的作用域,我们可以在其中保留旧方法
var old\u moduleMethod=my.moduleMethod

下一个问题:

为什么返回模块;如果不需要前一部分

您需要
返回模块
,因为否则函数将不会返回任何内容,
var module=
赋值将设置为未定义的值

下一个问题:

对于有时尚未定义模块的情况。。。是上述情况吗


是的,就是这样。如果未定义
模块
,则需要传入一个空对象。但是,如果一开始没有定义对象,通常会使用模式来扩展对象。这毫无意义,只会使您的代码复杂化。

如果您想扩展一个模块?是的,这一部分就是为了扩展模块,但对我来说有些部分似乎是多余的。嗯…
需要返回模块
,否则您不会公开模块。。。还要记住,javascript是函数范围的。如果你想扩展一个模块?是的,这一部分就是为了这个目的,但对我来说有些部分似乎是多余的。嗯…
返回模块是必需的,否则你就不会公开模块了。。。还要记住,javascript是函数作用域。我的问题是为什么要使用
var module=
part。当您执行
module\u impl.prototype.xxx=
时,即使没有
var module=
赋值,也可以通过
module
访问它……不会定义任何-
module
module\u impl
是匿名函数的本地对象,并且第一次是新创建的对象
{}