1

私は何か間違ったことをしているのですか、それともこれは不可能ですか?

(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()

ありがとう。

4

3 に答える 3

3

fooなぜあなたは持っていて利用できると期待しbarますか?これらの識別子がnamespaceオブジェクトに割り当てられることはありません。

で宣言された変数varは、現在のActivation / Variable ObjectのFunction(-Context)でのみ使用できます。function declarationsあなたの場合、同じことが言えますtest()。これらは両方とも、最初の無名関数からのAO内にのみ保存され、namespaceオブジェクト内には保存されません。値を明示的に割り当てる必要があります

namespace.foo = foo;
namespace.bar = "hello I am bar";
于 2011-10-12T10:06:14.937 に答える
1

コードにいくつかのバグがあります。そのコードは機能しています。

(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());
于 2011-10-12T10:26:33.217 に答える
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/

于 2013-04-12T13:09:32.113 に答える