Сразу же выполняющаяся функция и «это» - PullRequest
5 голосов
/ 26 мая 2011

Я хочу создать библиотеку 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?

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Я думаю, у вас есть несколько вопросов здесь:

  • вы ссылаетесь на parts в вашей функции init, не обращаясь к ней как к свойству this.
  • в блоке each вы обращаетесь к image как к глобальной переменной, но она не объявлена ​​глобально. Вы не можете получить доступ к image из this в этом блоке, потому что в этом контексте this фактически установлен на элемент, который вы перебираете (Вот почему вы можете получить доступ к this.num.)

Я полагаю, вы включили var that = this; перед вашей функцией инициализации и используйте ее при доступе к таким свойствам .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);
    });
};
1 голос
/ 26 мая 2011

Если я вас правильно понял, вы хотите получить доступ к свойству this.image, определенному внутри функции lib, из анонимной функции, которую вы предоставляете для each.Для этого вам нужно сохранить this, чтобы сделать его доступным в анонимной функции:

this.init = function() {
    var self = this;
    $(parts).each(function() {
        //do something with self.image
        self.image;
    });
};
0 голосов
/ 26 мая 2011

Вы также должны использовать первую букву имени функции lib с заглавной буквы, поскольку вы ожидаете, что она будет использоваться в качестве конструктора с ключевым словом new. Посмотрите, что автор Javascript The Good Parts говорит о соглашениях по именованию конструкторов в JavaScript .

...