обратитесь к параметрам в переменных в jQuery - PullRequest
4 голосов
/ 13 ноября 2011

просто любопытно узнать о jQuery / Javascript и ссылаться на опции в переменных.

Итак, я написал небольшой плагин, который при вызове «заполнять» заполнит некоторый текст.Очень простой.Вот что я пытаюсь сделать:

var foo = {
    msg1: "Hey",
    msg2: this.msg1 + "how",
    msg3: this.msg2 + "are",
    msg4: this.msg3 + "you",
    msg5: this.msg4 + "doing",
    msg6: this.msg5 + "today"
}

$("#bar").populate({text: foo.msg6});

Поэтому, когда вызывается плагин .populate, #bar будет добавлено «Привет, как дела сегодня»it.

Плагин populate трудно объяснить, но, поверьте мне, он работает отлично, а не проблема.Мне просто любопытно, возможна ли такая организация переменных и опций, поскольку кажется мне чище, более "семантическим" и более организованным, чем просто набор переменных, ссылающихся на другие переменные ...

Надеюсь, я понял!Спасибо всем!

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

this имеет значение только в execution context. Когда вы определяете функцию, для этой функции создается цепочка областей действия, которая будет использоваться всякий раз, когда эта функция входит в текущий контекст выполнения. Когда это произойдет, this станет определенным (во время выполнения). См. это для более подробной информации.

В вашем примере вы не определяете какие-либо новые цепочки областей действия, потому что вы не создаете никаких методов для вашего объекта. Поэтому, когда вы ссылаетесь на this, вы ссылаетесь на то, что есть this всякий раз, когда вы создаете свой foo объект. Скорее всего, вы работаете в глобальном пространстве, поэтому this будет window (если вы находитесь в браузере), но это может быть другой объект, который имеет функцию, в которой вы сейчас выполняете. Например: * * 1013

    var myScopeObj = {
        myMethod: function() {
            var foo = {
                msg1: "Hey",
                msg2: this.msg1 + "how",
                msg3: this.msg2 + "are",
                msg4: this.msg3 + "you",
                msg5: this.msg4 + "doing",
                msg6: this.msg5 + "today"
            };
            var foo2 = foo.msg6;
        }
    };

В приведенном выше примере есть несколько возможностей:

    myScopeObj.myMethod();  // 'this' refers to myScopeObj

или

    var method = myScopeObj.myMethod;
    method();  // 'this' refers to window

или

    myScopeObj.myMethod.call(window);  // 'this' refers to window

То, что вы можете сделать, это использовать функцию конструктора для вашего объекта и использовать this для сопоставления свойств.

    function Foo() {
        this.msg1 = "Hey";
        this.msg2 = this.msg1 + "how";
        this.msg3 = this.msg2 + "are";
        this.msg4 = this.msg3 + "you";
        this.msg5 = this.msg4 + "doing";
        this.msg6 = this.msg5 + "today";
    };
    var foo = new Foo();
    $("#bar").populate({text: foo.msg6});
2 голосов
/ 13 ноября 2011

В определении объекта, как у вас, this не ссылается на сам объект, поэтому объявление вашего объекта не будет делать то, что вы хотите.

На самом деле, в этом примере кода вы можете видеть, что this в этом определении объекта является window объектом, к которому его устанавливает интерпретатор javascript, когда нет другого значение, которое он должен иметь.

Я не понимаю, почему вы пытаетесь делать то, что делаете (поэтому я не могу предложить лучшие альтернативы), но вы могли бы в итоге получить желаемый объект foo, подобный этому, с помощью метода init() :

var foo = {
    msg1: "Hey",
    init: function() {
        this.msg2 = this.msg1 + "how";
        this.msg3 = this.msg2 + "are";
        this.msg4 = this.msg3 + "you";
        this.msg5 = this.msg4 + "doing";
        this.msg6 = this.msg5 + "today";
    }
}

foo.init();
$("#bar").populate({text: foo.msg6});

или вы можете использовать это с функцией конструктора:

function Foo() {
    this.msg1 = "Hey";
    this.msg2 = this.msg1 + "how";
    this.msg3 = this.msg2 + "are";
    this.msg4 = this.msg3 + "you";
    this.msg5 = this.msg4 + "doing";
    this.msg6 = this.msg5 + "today";
}

var foo = new Foo();
$("#bar").populate({text: foo.msg6});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...