jquery闭包无法使用DOM对象检索私有变量



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

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();
});
});

现在,如果你在代码中查看,有一个名为shoePreview的变量,我认为模块之外的任何东西都无法访问它。

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

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

我已经用var shoeImage=$('#shoe preview')进行了测试,然后用所需的标记调用html(),效果很好。

这个问题很小,但却把我逼疯了。我在写var shoePreview=$('#shoe preview')吗;以错误的方式或有更多的事情。任何帮助都将不胜感激。

谢谢。

这里只有一个问题:(function(){hackhackhack()})()的字面意思是-运行闭包,这意味着你试图在DOM准备好之前访问它,你只需要在init之后设置var,而不是在主函数中,

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();
});
});

最新更新