5

我想创建一个 javascript 库,所以我认为让它成为一个立即自我执行的函数将是一件好事,以确保范围安全和一切。

但是现在我在使用我不太理解的“this”关键字时遇到了问题。

如何使这样的代码正常工作?目前,它告诉我“图像”未定义。

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

我怎样才能进入该image物业?

4

3 回答 3

2

我认为您在这里有几个问题:

  • parts您在函数中引用init而不将其作为this.
  • each块内,您image作为全局变量访问,但未在全局范围内声明。您无法imagethis该块中访问,因为在该上下文中,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);
    });
};
于 2011-05-26T13:31:05.850 回答
1

如果我理解正确,您希望从您提供this.image给. 为此,您需要保留以使其在匿​​名函数中可用:libeachthis

this.init = function() {
    var self = this;
    $(parts).each(function() {
        //do something with self.image
        self.image;
    });
};
于 2011-05-26T13:27:02.633 回答
0

您还应该将函数名称的第一个字母大写,lib因为您希望它用作带有new关键字的构造函数。看看 Javascript The Good Parts 的作者对 JavaScript 中的构造函数命名约定的看法。

于 2011-05-26T13:39:56.890 回答