为javascript库创建名称空间

时间:2013-06-15 19:41:07

标签: javascript

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

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

我正在尝试这样编写这个库:

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

这是我在其他地方看到的模式,但我不能说我完全理解发生了什么。当我尝试使用它时,我被告知在我尝试定义foo时未定义foo.bar。我错过了什么?

4 个答案:

答案 0 :(得分:3)

有太多可能的模式,无法确定你想要的模式。

您可以这样做,例如:

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存在,并将bar函数添加到foo。如果之前不存在foo,则会创建它。如果它之前存在,它只是增强了。

可以使用相同的逻辑创建子模块,然后更有意义。

答案 1 :(得分:3)

阅读本书了解js-patterns:

http://addyosmani.com/resources/essentialjsdesignpatterns/book/

它是自由的,它的伟大!

受痛苦回答的启发我会稍微改变它并像这样写出来

var foo = (function () {

  // your private stuff here

  return {
    bar: function () {}
  };

})();

答案 2 :(得分:2)

或者你可以这样做:

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

但这是一个对象字面值,但仍然可以使用foo.bar()

调用

答案 3 :(得分:1)

我今天会写这样的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

Dr. Axel Rauschmayer就这个话题写过。