我做错了什么或者这是不可能的:
(function(namespace,undefined)
{
//Private properties and methods
var foo="bar";
function test(){return foo;}
//Public properties and methods
namespace.foobar=foo+"123";
namespace.showFoo=function(){return test();};
})(window.namespace=window.namespace || {});
然后我尝试“扩展”上面的命名空间并添加一个新方法:
(function(namespace,undefined)
{
//Public method
namespace.sayGoodbye=function()
{
alert(namespace.foo);
alert(namespace.bar);
alert(test());
}
})(window.namespace=window.namespace || {});
警报显示属性undefined
,并为test()
方法引发错误。
感谢。
答案 0 :(得分:3)
为什么您希望foo
和bar
可用?这些标识符永远不会分配给您的namespace
对象。
使用var
声明的任何变量仅在当前激活/变量对象的Function(-Context)中可用。同样适合function declarations
,在您的情况下,test()
。这两者都只存储在第一个匿名函数的AO中,并且不存储在namespace
对象中。您必须明确指定值
namespace.foo = foo;
namespace.bar = "hello I am bar";
答案 1 :(得分:1)
您的代码中有几个错误。该代码正在运行。 Example
(function(namespace)
{
if(namespace === undefined) {
window.namespace = namespace = {};
}
//Private properties and methods
var foo="bar";
function test(){return foo;}
//Public properties and methods
namespace.foobar=foo+"123";
namespace.showFoo=function(){return test();};
})(window.namespace);
(function(namespace)
{
if(namespace === undefined) {
window.namespace = namespace = {};
}
//Public method
namespace.sayGoodbye=function()
{
alert(namespace.foobar);
alert(namespace.showFoo());
}
})(window.namespace);
window.namespace.sayGoodbye();
错误: 1.您永远不会设置变量window.namespace。 2.如果在函数中以私有方式声明变量/函数,则只有此特定函数才能访问这些变量/函数。 如果要使用命名空间,可以这样做:
var namespace = (function(){
var private = "private";
function privateFunc() {
return private;
}
return {
"publicFunc": function(){return privateFunc()}
}
})();
namespace.publicFunc() === "private";
//alert(namespace.publicFunc());
// extend namespace
(function(namespace){
var private = "other private";
namespace.newFunc = function(){return private};
})(namespace);
namespace.newFunc() === "other private";
//alert(namespace.newFunc());
答案 2 :(得分:1)
命名空间声明和名称空间的扩展:
var namespace = function(str, root) {
var chunks = str.split('.');
if(!root)
root = window;
var current = root;
for(var i = 0; i < chunks.length; i++) {
if (!current.hasOwnProperty(chunks[i]))
current[chunks[i]] = {};
current = current[chunks[i]];
}
return current;
};
// ----- USAGE ------
namespace('ivar.util.array');
ivar.util.array.foo = 'bar';
alert(ivar.util.array.foo);
namespace('string', ivar.util); //or namespace('ivar.util.string');
ivar.util.string.foo = 'baz';
alert(ivar.util.string.foo);
尝试一下:http://jsfiddle.net/stamat/Kb5xY/
博文:http://stamat.wordpress.com/2013/04/12/javascript-elegant-namespace-declaration/