问题描述
|
我想创建一个JavaScript库,因此我认为将其设置为立即可自动执行的功能对于确保范围安全和所有方面都是一件不错的事情。
但是现在我使用我不太了解的\“ this \”关键字遇到了问题。
我如何使这样的代码正常工作?目前,它告诉我\“ image \”未定义。
(function() {
function lib() {
this.image = document.getElementById(\"image\");
this.parts = [
{name: \"part1\",num: \"1\"}
];
this.init = function() {
$(parts).each(function() {
var partNum = this.num;
image.getElementById(partNum).addEventListener(\"click\",function() {
toggleHighlight(partNum);
},true);
});
};
}
window.lib = new lib();
})();
window.lib.init();
如何访问ѭ1财产?
解决方法
我认为您在这里遇到一些问题:
您在
init
函数中引用parts
而不将其作为this
的属性进行访问。
在each
块中,您正在将image
作为全局变量访问,但未全局声明。您无法从该块中的this
访问image
,因为在这种情况下,this
实际上已设置为要迭代的项目。 (这就是为什么您可以访问this.num
的原因。)
我建议您包括var that = this;在您的init函数之前,并在访问诸如that.image之类的属性时使用它。
var that = this;
this.init = function() {
$(this.parts).each(function() {
var partNum = this.num;
that.image.getElementById(partNum).addEventListener(\"click\",function() {
toggleHighlight(partNum);
},true);
});
};
,如果我没错,您想从提供给each
的匿名函数访问lib
函数内部定义的this.image
属性。为此,您需要保留this
以使其在匿名函数中可用:
this.init = function() {
var self = this;
$(parts).each(function() {
//do something with self.image
self.image;
});
};
,您还应该将函数名称lib
的首字母大写,因为您希望它与new
关键字一起用作构造函数。看一看Javascript The Good Parts的作者对JavaScript中的构造函数命名约定的看法。