Javascript范围帮助

时间:2010-10-18 21:34:32

标签: javascript

我是javascript的新手所以请耐心等待我的要求是完全愚蠢的!

我正在尝试制作一个简单的模块。在模块内部,我想要一个包含模块设置的配置对象。我也在使用jquery。 jquery选择器仅在直接在主对象/模块中的函数中工作。

我知道javascript具有功能范围,所以我很惊讶我不能在模块内的任何地方使用jquery选择器。

编辑: 我希望能够使用jquery选择器直接在configs对象中设置我的所有配置。这样我就把所有杂乱的东西放在一个地方,然后可以访问configs.whatever整个模块的其余部分。目前,jquery选择器在configs模块中不起作用。

    var OB = function() {

    var configs = {
        'mode'    : 'test',
        'numOfSelects' : $('.mySelect').find('select').length,  // This doesnt work
    }

    var getMode = function() {
        return configs.mode;
    }

    function init() { 
        alert(configs.numOfSelects);  // This alerts 0 until the following line
        alert($('.mySelect').find('select').length);  // This correctly alerts 2
    };

    var handlers = {
        successHandler : function() {
            alert("Success");
        },
        errorHandler : function() {
            alert("error");
        }
    }

    return {
        init    : init,
        getMode : getMode
    }

}( );

$(document).ready(function(){
    OB.init();
});

3 个答案:

答案 0 :(得分:1)

编辑:有趣的是,我在下面的原始答案不正确,因为我在OB的定义末尾没有注意到两个小括号,结果证明这些是罪魁祸首。您定义然后立即调用OB,这是在DOM完全加载之前。删除这些括号并进行我在下面建议的更改。

调用OB()会返回包含initgetMode的对象,但您尚未调用OB(),而您只提到OB。试试这个:

$(document).ready(function(){
    OB().init();
});

另外,我假设你想稍后引用getMode。特别是,您将获得可以访问init()调用有权访问的同一本地范围的getMode副本。为此,您需要存储调用OB()的结果以供以后使用:

var ob;

$(document).ready(function(){
    ob = OB();
    ob.init();
});

function some_other_function() {
    ... ob.getMode() ...;
}

答案 1 :(得分:1)

并不是说jQuery不在范围内 - 这就是代码在您认为没有执行时。在执行匿名函数(config)时定义变量var OB = function() {}()。 DOM还没有准备好,因此DOM遍历找不到任何东西。当你在init()中进行DOM遍历时,直到在$(document).ready()处理程序中显式调用它才会执行,此时DOM就会被设置。这就是你所看到的不同。

答案 2 :(得分:1)

在DOM完全加载后需要调用

OB()。因此,Marcelo的回答是OB()方法中的ready()