如何在同一命名空间内从函数B调用函数A?

时间:2013-07-22 15:04:08

标签: javascript

假设我有命名空间,

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。但我很好奇这里的最佳做法是什么。

5 个答案:

答案 0 :(得分:11)

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

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

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

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

    return self;
}());

Namespace.B(); // Works
Namespace.A(); // Doesn't work

答案 1 :(得分:5)

您可以使用this声明

来调用它
this.A();

答案 2 :(得分: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;
})();

答案 3 :(得分:1)

如果您只打算在A内使用B,为什么不在B内定义?

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

        A();
    }
};

Namespace.B();

答案 4 :(得分:-2)

var Namespace = {
    A : function() {
        alert('Hello!');
    },
    B : function() {
        Namespace.A();
    }, 
}
  

注意结尾的分号