Javascript 立即自动执行功能和;这";

Javascript 立即自动执行功能和;这";,javascript,scope,execute-immediate,Javascript,Scope,Execute Immediate,我想创建一个javascript库,所以我认为让它成为一个立即自动执行的函数是一件很好的事情,可以确保范围安全和一切 但是现在我在使用“this”关键字时遇到了一个我不太理解的问题 如何使这样的代码正确工作?目前,它告诉我“图像”是未定义的 (function() { function lib() { this.image = document.getElementById("image"); this.parts = [ {na

我想创建一个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
属性?

如果我理解正确,您希望从您提供给
每个
函数的匿名函数访问
库中定义的
此.image
属性。为此,您需要保留此
,以使其在匿名函数中可用:

this.init = function() {
    var self = this;
    $(parts).each(function() {
        //do something with self.image
        self.image;
    });
};

我想你有一些问题:

  • 您正在
    init
    函数中引用
    部分
    ,而没有将其作为
    的属性进行访问
  • 每个
    块中,您将作为全局变量访问
    图像
    ,但它不是全局声明的。您无法从该块中的
    this
    访问
    图像
    ,因为在该上下文中,
    this
    实际上被设置为您正在迭代的项目。(这就是为什么您可以访问
    this.num
我建议你包括var=this;在您的init函数之前,并在访问类似.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);
    });
};

您还应该将函数名
lib
的第一个字母大写,因为您希望它用作带有
new
关键字的构造函数。看看Javascript好部分的作者说了些什么。

您是否尝试过在FireBug或Opera DragonFly之类的工具中进行调试?大多数情况下,您可以看到当前范围是什么以及定义了哪些变量。