Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript模块:返回一个裸对象,或将其命名_Javascript_Module - Fatal编程技术网

Javascript模块:返回一个裸对象,或将其命名

Javascript模块:返回一个裸对象,或将其命名,javascript,module,Javascript,Module,使用Javascript模块模式,与创建包含接口的命名对象然后返回引用相比,返回包含接口的裸对象有哪些优点/缺点?下面是示例代码。我总是将接口放入一个命名对象中,我看到的一个优点是我可以在返回它之前进行一些调试 function bareObjectModule() { return { method1: function() {} //etc. } } function namedObjectModule() { var namedOb

使用Javascript模块模式,与创建包含接口的命名对象然后返回引用相比,返回包含接口的裸对象有哪些优点/缺点?下面是示例代码。我总是将接口放入一个命名对象中,我看到的一个优点是我可以在返回它之前进行一些调试

function bareObjectModule() {
    return {
        method1: function() {}
        //etc.
    }
}

function namedObjectModule() {
    var namedObjectModule = {
        method1: function() {}
    }

    //debug here?
    return namedObjectModule;
}

除了您提到的调试优势之外,我认为这两种方法没有任何区别。由于namedObjectModule是函数本地的,因此一旦函数返回(即堆栈中的变量名),它将被丢弃


一个次要的问题是,对于命名对象,局部变量“namedObjectModule”将有一个堆栈条目(函数返回后将弹出),函数调用堆栈(对同一对象)中将有一个条目用于返回工作。对于裸露对象,可以避免前者。不确定这是否有任何实际的性能影响,除非堆栈中有数千个对象。

主要区别在于,对于引用的对象,可以使用属性并从其他方法调用方法。你不能用一个单一的对象文字来做这件事

作为这两种方法的替代方法,您可以将封闭函数作为构造函数调用(使用
new
),并让它返回
对象以导出模块

var myModule = new function () {
    this.methodA = function () { /* ... */ }

    this.methodB = function () { /* ... */ }

    console.log(this) // debug
}

无需显式键入
return
(默认情况下构造函数返回
this
)并定义对象文字(并给出名称)作为奖励。

直接返回接口的主要优点是它很短,不包含太多的样板文件,但是有一个命名的引用功能更强大,并且允许使用最初无法使用的其他模式。最大的优点是,如果您有对模块的引用,那么让函数相互引用就容易多了

var M = {};
M.f1 = function(){ ... };

M.f2 = function(){  M.f1() }; //functions can reference each other without
                              // a fragile dynamic binding through `this`

M.f3 = some_combinator(M.f2); //since you are not limited to defining things as 
                              //property-value pairs you have much more flexibility..

return M;

newfunction(){}
是一个令人困惑的结构。大多数样式指南建议您避免使用它,而选择其他样式。如果您添加额外的魔术括号,使其看起来更像传统的模块模式
(new function(){})
,我不会发现这种模式令人困惑。不过,我不喜欢它是如何依赖于“this”的——我认为模块的显式名称的好处大于成本。@missingno,关于上下文的观点很好。模块模式应该是松散相关的通用实用程序的名称空间集合,而不是对象接口。非常好的一点是,我在模块接口中的方法之间共享功能的方法是在闭包底部创建“私有”函数声明(是的,在返回下面,它们被提升),无论我是返回一个裸对象作为接口,还是返回一个命名的reference@GeorgeJempty当前位置我不喜欢依赖吊装。我更喜欢按照正常的顺序进行处理,这样,如果出于某种原因,我不得不使用var,那么一切都可以正常工作。