7

假设我有命名空间,

var Namespace = {
    A : function() {
        alert('Hello!');
    },
    B : function() {
        // Call A() from here, do other stuff
    }
}

在这个命名空间中,我打算让 A 成为 B 的辅助函数。也就是说,永远不会在命名空间之外调用 A()。它只会被命名空间内的函数调用。

解决命名空间中本地/辅助函数问题的最佳方法是什么?在我看来,有两种可能:

// Method #1    
var Namespace = {
    A: function() {
        alert('Method #1');   
    },

    B : function() {
        Namespace.A();
    }
}

Namespace.B();

// Method #2
function Namespace2() {
    var A = function() {
        alert('Method #2');
    };

    this.B = function() {
        A();        
    }
}

var ns2 = new Namespace2();
ns2.B();

在第一种方法中,在命名空间内的每个函数中(重复)键入 Namespace.A() 既丑陋又尴尬。这使我更喜欢方法#2。但我很好奇这里的最佳做法是什么。

4

5 回答 5

12

我建议将“命名空间”放在函数范围内。没有明确公开的所有内容自然是私有的:

var Namespace = (function() {
    var self = {};

    // Private
    var A = function() {
        ...
    };

    // Public
    self.B = function() {
        A();
    }

    return self;
}());

Namespace.B(); // Works
Namespace.A(); // Doesn't work
于 2013-07-22T15:17:51.833 回答
5

您可以使用this语句调用它

this.A();
于 2013-07-22T15:06:49.563 回答
2

那么你可以使用第三个选项,在它自己的范围内创建命名空间:

var Namespace = (function(){
    var A = function() {
        alert('scoped method');
    };

    function Namespace() {

          var A1 = function() {
               alert('Namespace "private" method');
          };

          Namespace.prototype.B1 = function(){
              A();  //will run
              A1(); //will run with no errors
          };

    };

    Namespace.prototype.B = function(){
        A();  //will run
        A1(); //ERROR!
    };

    return Namespace;
})();
于 2013-07-22T15:07:26.863 回答
1

如果只打算在A里面使用B,为什么不在里面定义呢B

var Namespace = {
    B: function() {
        var A = function() {
            ...
        }

        A();
    }
};

Namespace.B();
于 2013-07-22T15:07:22.753 回答
-2
var Namespace = {
    A : function() {
        alert('Hello!');
    },
    B : function() {
        Namespace.A();
    }, 
}

注意最后的分号

于 2015-05-14T17:08:10.033 回答