Javascript jquery闭包无法检索具有DOM对象的私有变量

Javascript jquery闭包无法检索具有DOM对象的私有变量,javascript,jquery,dom,closures,Javascript,Jquery,Dom,Closures,如果有人能帮我的话,我在闭包和检索一个私有变量方面遇到了问题,这个私有变量是使用jquery通过id选择的元素。我有这样一个模块: var package = package || {}; (function() { if(!package.slider) package.slider = {}; function Slider() { } // --------- /Public Member

如果有人能帮我的话,我在闭包和检索一个私有变量方面遇到了问题,这个私有变量是使用jquery通过id选择的元素。我有这样一个模块:

var package = package || {};

(function() {
        if(!package.slider)
                package.slider = {};

        function Slider() {
        }

        // --------- /Public Members --------- //
        Slider.prototype = {
            init: function(){
                _setEvents();
            }
        };

        // --------- Public Members --------- //


        // --------- Private Members --------- //
        var shoePreview = $('#shoe-preview');  /*somehow this variable does NOT get recognised even though I have it in the DOM.*/

        function _setEvents(){
            $.subscribe('getAllPerspectives', function(event){ _getAllPerspectives() });
            $.subscribe('showPreview', _show);
            $.subscribe('hidePreview', _hide);
        }

        function _getAllPerspectives(){
            _getAngleShoeImage(helper.getCurrentAngle());
            $.each(constants.angles, function(key, val){
                if(val != helper.getCurrentAngle()){
                    _getAngleShoeImage(val);
                }
            });
        }

        function _getAngleShoeImage(angle){
            var shoeImage = shoePreview;
            shoeImage.html('<p>Hello World</p>');

        }


        var that = new Slider();
        package.slider = that;

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

    $.each(package, function (key, val){
        val.init();
    });
});
var package=package | |{};
(功能(){
如果(!package.slider)
package.slider={};
函数滑块(){
}
//---------------/公众成员------//
Slider.prototype={
init:function(){
_setEvents();
}
};
//------公众成员------//
//------私人成员------//
var shoePreview=$(“#shoe preview”);/*尽管我在DOM中有这个变量,但不知何故,它没有被识别*/
函数_setEvents(){
$.subscribe('getAllPerspectives',函数(事件){u getAllPerspectives()});
$.subscribe('showPreview',_show);
$.subscribe('hidePreview',_hide);
}
函数_getAllPerspectives(){
_getAngleShoeImage(helper.getCurrentAngle());
$.each(常数、角度、函数(键、值){
if(val!=helper.getCurrentAngle()){
_getAngleShoeImage(val);
}
});
}
函数_getAngleShoeImage(角度){
var shoeImage=shoePreview;
html(“helloworld

”); } var=newslider(); package.slider=那个; })(); $(文档).ready(函数(){ $。每个(包、功能(键、val){ val.init(); }); });
现在,如果您查看代码,有一个名为shoePreview的变量,我假设模块之外的任何东西都无法访问该变量

现在,在稍后的代码中的某个地方,我将调用一些方法,这些方法将触发_getAngleShoeImage,我在其中将名为shoeImage的变量设置为私有shoePreview变量

问题是,一旦我尝试使用jquery的html()调用,它似乎无法识别shoePreview变量是什么

我已经通过替换var shoeImage=$(“#shoe preview”),然后使用所需的标记调用html(),对其进行了测试,效果良好

这个问题很小,但我快发疯了。我是否正在编写var shoeepreview=$(“#鞋预览”);以错误的方式,或者有更多的东西。任何帮助都将不胜感激

谢谢。

这里只有一个问题:
(function(){hackhack()})(
字面意思是-运行闭包,这意味着您试图在DOM就绪之前访问它,您只需要在init之后设置var,而不是在main函数中

var package = package || {};

(function() {
    if(!package.slider)
            package.slider = {};

    function Slider() {
    }

    // --------- /Public Members --------- //
    Slider.prototype = {
        init: function(){
            //New function here
            _setVars();
            _setEvents();
        }
    };

    // --------- Public Members --------- //


    // --------- Private Members --------- //
    //make it accessible for other proto functions;
    var shoePreview;

    function _setVars() {
       shoePreview=$('#shoe-preview'); // now it will be set when init() run not when object proto initialised
    }
    function _setEvents(){
        $.subscribe('getAllPerspectives', function(event){ _getAllPerspectives() });
        $.subscribe('showPreview', _show);
        $.subscribe('hidePreview', _hide);
    }

    function _getAllPerspectives(){
        _getAngleShoeImage(helper.getCurrentAngle());
        $.each(constants.angles, function(key, val){
            if(val != helper.getCurrentAngle()){
                _getAngleShoeImage(val);
            }
        });
    }

    function _getAngleShoeImage(angle){
        var shoeImage = shoePreview;
        shoeImage.html('<p>Hello World</p>');

    }


    var that = new Slider();
    package.slider = that;

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

    $.each(package, function (key, val){
        val.init();
    });
});
var package=package | |{};
(功能(){
如果(!package.slider)
package.slider={};
函数滑块(){
}
//---------------/公众成员------//
Slider.prototype={
init:function(){
//这里有新功能
_setVars();
_setEvents();
}
};
//------公众成员------//
//------私人成员------//
//使其可用于其他原型功能;
var-shoePreview;
函数_setVars(){
shoePreview=$(“#shoe preview”);//现在它将在init()运行时设置,而不是在初始化对象proto时设置
}
函数_setEvents(){
$.subscribe('getAllPerspectives',函数(事件){u getAllPerspectives()});
$.subscribe('showPreview',_show);
$.subscribe('hidePreview',_hide);
}
函数_getAllPerspectives(){
_getAngleShoeImage(helper.getCurrentAngle());
$.each(常数、角度、函数(键、值){
if(val!=helper.getCurrentAngle()){
_getAngleShoeImage(val);
}
});
}
函数_getAngleShoeImage(角度){
var shoeImage=shoePreview;
html(“helloworld

”); } var=newslider(); package.slider=那个; })(); $(文档).ready(函数(){ $。每个(包、功能(键、val){ val.init(); }); });
谢谢,我想这可能会奏效。这样做之后,我就能够得到一个对象,但是,当我试图使用html()查看其中的标记时,当我试图将其输出为警报时,它似乎总是返回未定义。这很奇怪(有什么可能出错的吗?你真是个传奇!!:)谢谢你的快速回复。你写(function(){hackhack()})的时候我在笑。这只是你写这篇文章的特殊原因吗?真的非常感谢:)我想我用了几周前读到的文件