我正在尝试创建一个包含函数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
。我错过了什么?
答案 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就这个话题写过。