这个JavaScript模块模式有什么优势?

3

我已经写了一段时间的backbone应用程序,我的模块通常是这样结构的:

var AppName = AppName || {};

AppName.Module = {};

AppName.Module.View = Backbone.View.extend({...});
AppName.Module.Model = Backbone.Model.extend({...});

但是我最近偶然发现了这个模块化的设计模式:

var AppName = AppName || {};

AppName.Module = (function() {
    var View = Backbone.View.extend({...});
    var Model = Backbone.Model.extend({...});

    return {
        View: View,
        Model: Model
    }
})();

在第二种模式中,您可以定义“私有”方法,这些方法只能从模块范围内访问,但除此之外,我认为它似乎是一种更难测试的模式。有人能解释一下为什么一些JavaScript程序员喜欢第二种方法作为一种本质上更好的模式吗?

4
为什么第二种方法是一种固有更好的模式?看起来你已经下定了决心,并且提供了这个观点的原因。 - Cerbrus
我的意思是我看过关于这个的博客文章,描述它是一个更好的模式,但我不明白为什么。我编辑了这篇文章以便更清楚。 - jaapz
是的,因为可以使用“私有”的本地变量。 - Bergi
1个回答

3

这是因为您可以使用私有变量。例如,我们可以使用该模式来定义bob并强制代码使用setName函数来更改他的姓名(即您不能通过直接访问它来更改变量的值:

var bob = (function(){
  var name = "Bob";

  return {
    setName: function(newName){
      name = newName;
    },
    getName: function(){
      return name;
    }
  }
}());

console.log(bob.getName()); // "Bob"
console.log(bob.name); // undefined
bob.setName("Bobby");
console.log(bob.getName()); // "Bobby"

通过立即执行函数定义,您可以获得一个新的作用域,使用闭包来“隐藏”内部变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接