javascript中的命名空间问题

时间:2013-07-01 01:11:39

标签: javascript jquery

即使我使用命名空间,函数名也是混合的。在下面的示例中,当我致电nwFunc.callMe()$.Test1.callTest()时,它将执行_testFunction()的{​​{1}}。我希望doOneThing$.Test1.callTest() API中调用_testFunction()而不是$.Test1中的doOneThing。我需要做些什么来纠正它?

示例:

var doOneThing = function() {
    _testFunction= function() {
        ...
    }

    return {
         // public 
         callMe: function(){
        _testFunction();
         }
    }
}

var nwFunc = doOneThing();
nwFunc.callMe();
$.Test1.callTest();
下面的

是一个示例API

jQuery.Test1 = (function(){

    _testFunction= function() {
        ...// do differently
    }


    return {
        // public
        callTest: function(){
            _testFunction()
        }
    }
}(jQuery))

2 个答案:

答案 0 :(得分:5)

您不在对象文字中,而是在函数体中。

_testFunction: function() {
    .... // do differently
}

不是一个对象属性,而是一个以label开头的匿名函数表达式,因为它没有被分配到任何地方而被遗忘。改为简单的函数声明:

function _testFunction() {
    .... // do differently
}

return {
     // public 
     callMe() {
         _testFunction();
     }
}

只是一个语法错误,在这里你需要object literal sytnax

return {
    // public
    callTest: function() {
        _testFunction()
    }
};

return {
    // public
    callTest: _testFunction // exporting the function directly
};

  

当我致电nwFunc.callMe()$.Test1.callTest()时,它会执行_testFunction()的{​​{1}}。我需要做些什么来纠正它?

您必须使用var declarationdoOneThing变量放在本地范围内。目前您正在写入全球范围,其中只有一个_testFunction存在(目前_testFunction您正在覆盖doOneThing _testFunctionjQuery.Test1 callTest函数将调用新函数)。函数声明也会修复此问题(使用本地范围)is similar to a var statement + function expression

答案 1 :(得分:3)

您正在混淆语法。在最初声明函数并在实际创建对象时使用函数声明表示法时,您正在使用对象文字表示法,因此您应该切换两个:

jQuery.Test1 = (function(){

    function _testFunction() {
        .... // do differently
    }

    return {
        // public
        callTest: _testFunction
    }
}(jQuery))