为javascript库创建名称空间

为javascript库创建名称空间,javascript,Javascript,我正在尝试创建一个库foo.js,其中包含一个函数foo.bar,我可以这样调用它: <script src="foo.js"></script> <script> baz = foo.bar(); </script> 这是我在其他地方看到的一种模式,尽管我不能说我完全理解正在发生的事情。当我尝试使用它时,我被告知当我尝试定义foo.bar时,foo没有定义。我遗漏了什么?有太多可能的模式,无法确定您想要哪一种 您可以这样做,例如: va

我正在尝试创建一个库foo.js,其中包含一个函数foo.bar,我可以这样调用它:

<script src="foo.js"></script>
<script>
    baz = foo.bar();
</script>

这是我在其他地方看到的一种模式,尽管我不能说我完全理解正在发生的事情。当我尝试使用它时,我被告知当我尝试定义foo.bar时,foo没有定义。我遗漏了什么?

有太多可能的模式,无法确定您想要哪一种

您可以这样做,例如:

var foo = (function(foo) {
    // here you can also declare "private" non exported variables,
    //   including functions that could be used by bar
    foo.bar = function() {
        // code goes here
    }
    return foo;
})(foo||{});
这将确保foo存在,并向foo添加一个bar函数。如果foo以前不存在,它就被创建了。如果它以前存在,它只是被扩充了

同样的逻辑可以用来创建子模块,这样就更有意义了。

或者您可以这样做:

var foo = {
           bar : function() {
               // code goes here
          }
};

但这是一个对象文字,但仍然可以用foo.bar调用

阅读本书了解js模式:

它是免费的,而且很棒

受dystroys答案的启发,我将对它稍加修改,然后这样写

var foo = (function () {

  // your private stuff here

  return {
    bar: function () {}
  };

})();

我今天会这样编写javascript模块:

(function(exports){

    exports.greet = function(){
        return 'hello beloved world'
    };

})(typeof exports === 'undefined'? this['uebermodule']={}: exports);
因此,您可以在浏览器和node.js中使用lib

uebermodule.greet() // is uniform in node as in browser

就这个话题写的。

foo和foo,这是一个令人困惑的世界+我喜欢这个图案。然后还有原型、文字和其他一百种可供选择的方法,它们的作用几乎相同。对于简单的事情,我总是使用对象文字,因为我认为它更容易理解和跟踪,但我想这只是一个意见问题。你需要返回你的内心世界!dystroy生来就有他所有的内在食物,所以他不需要归还任何东西,你需要把你的内在食物归还给dystroy。意大利面条++,不是这样做的。foo.bar必须是this.bar。并使用new创建它的新实例,而不是使用foo作为参数。
uebermodule.greet() // is uniform in node as in browser