如何调用同一javascript命名空间中的另一个函数?

如何调用同一javascript命名空间中的另一个函数?,javascript,Javascript,我喜欢用名称空间风格组织javascript,如下所示。我想知道的是:有没有另一种(更短的?)方法可以从mySecondFunction()调用myFirstFunction()?我尝试了this.myFirstFunction(),但它不起作用,所以这里可能有某种神秘的技巧,我不知道 var myNameSpace = { myFirstFunction: function(){ alert("Hello World!"); }, mySecondFun

我喜欢用名称空间风格组织javascript,如下所示。我想知道的是:有没有另一种(更短的?)方法可以从
mySecondFunction()调用
myFirstFunction()
?我尝试了
this.myFirstFunction()
,但它不起作用,所以这里可能有某种神秘的技巧,我不知道

var myNameSpace = {
    myFirstFunction: function(){
        alert("Hello World!");
    },
    mySecondFunction: function(){
        myNameSpace.myFirstFunction();
    }
}

像往常一样感谢你们的帮助,SO的人们!:)

您使用“this”的建议应该有效。i、 e:

var myNameSpace = {
    myFirstFunction: function(){
        alert("Hello World!");
    },
    mySecondFunction: function(){
        this.myFirstFunction();
    }
}
结果:

myNameSpace.mySecondFunction() // "Hello World!".

正如在示例代码中所写,
这个.myFirstFunction()
可以工作。您的代码可能会被简化以说明您的问题,因此查看实际代码来说明它为什么不能与
this
一起工作可能会有所帮助


它失败的一个可能原因是调用
this.myFirstFunction()
的代码在闭包中。如果是这样,
将是对关闭函数的引用,而不是您的命名空间,因此将失败。请参阅根据您的代码设计的示例,以了解我的意思。同样,查看实际代码可能有助于诊断发生了什么。

在某些情况下,
这个
关键字应该可以正常工作。如果显式调用
myNameSpace.mySecondFunction()
,则
this.myFirstFunction()
将按预期执行

如果将
myNameSpace.mySecondFunction
用作事件处理程序,则可能不会。对于事件处理程序,您需要某种方式来引用要使用的命名空间。许多JavaScript框架提供了一种定义this
关键字所指内容的方法。例如,在中,您可以执行
myNameSpace.mySecondFunction.bind(myNameSpace)
,这将导致
this
mySecondFunction
中引用
myNameSpace
。如果不使用框架,可以将事件处理程序设置为匿名函数,如:

document.getElementById('myId').addEventListener('click', function(e) {
  myNameSpace.mySecondFunction.call(myNameSpace);
});
有关调用方法的更多信息,我将参考或,您可以使用它,其行为类似于调用,但为第二个参数传递参数数组,而不是为其他参数使用类似varargs的方法

所有这些建议都基于将命名空间定义为:


关于JavaScript函数绑定的更多信息,我强烈建议阅读

< P>如果您希望它更短,也许您应该考虑以下模式:

基本上以您的示例为例:

var myNameSpace = (function()
{
    function _myFirstFunction(){
        alert("Hello World!");
    }

    function _mySecondFunction(){
        _myFirstFunction();
    }

    return {
        MyFirstFunction : _myFirstFunction,    
        MySecondFunction : _mySecondFunction
    };
})();
我发现这是最干净的模式,还提供了javascript中的“private/public”变量,如果您附加到事件: 如果将命名空间的函数附加到事件,则可能会出现问题,如:

$(el).on("click", nameSpace.myFunc);

....

nameSpace = {

    myFunc: function(){
       this.anotherFunc();
    }

}
那会造成错误

解决方案1 您可以使用
nameSpace.anotherFunc()
更改
this.anotherFunc()

解决方案2 你可能会改变

$(el).on("click", nameSpace.myFunc);
// to ----->
$(el).on("click", function(){ nameSpace.myFunc(); }  );

你的例子是正确的,它应该是有效的。很好的简单答案。我完全理解您的JSFIDLE示例。谢谢,你刚刚让我的js代码更干净了一点!你是对的,我简化了我的代码,把它发布在这里,我对函数的调用是在一个闭包中完成的。我不知道这会影响“this”关键字。再次感谢!没问题,加布里埃尔。很高兴这有帮助。:)
$(el).on("click", nameSpace.myFunc);
// to ----->
$(el).on("click", function(){ nameSpace.myFunc(); }  );