实际上,以下两种模式之间的区别是什么?

一种

mySpace = mySpace || {}
mySpace.isObsolete = function() {};
mySpace.hipsterYear = 2006;


用法:

var iable = mySpace.isObsolete();
var year = mySpace.hipsterYear;


B(即模块模式)

mySpace = (function(){
  var obj = {};
  var someVar = 2012;
  obj.hipsterYear = 2006;
  obj.isObsolete: function() {};
  return obj;
}());


用法:

var iable = mySpace.isObsolete();
var year = mySpace.hipsterYear;


在B中,匿名函数创建一个范围,在该范围中无法从外部访问someVar。我想这样的构造在A中是不可能的?
因此,A和B在创建范围方面有所不同。

名称空间有什么区别? A和B等价吗?

最佳答案

B通常称为“模块模式”,它允许选择使用面向对象的方法来对变量和方法进行公共和私有访问,而对于A,一切都是公共的。 Douglas Crockford最好地解释here

通常,这是一个好主意,因为使用A中的方法使所有内容都容易受到其他代码/编码器的干扰。如果某人(可能是您)决定采用快捷方式,这会增加出现隐蔽错误的可能性。

09-18 08:28