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