只是好奇jQuery / Javascript并引用变量中的选项。
所以,我写了一个小插件,当我打电话给“populate”时会填写一些文字。非常基本的。这就是我想要做的事情:
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将获得“嘿,你今天做得怎么样”。
填充插件很难解释,但相信我的工作很好而不是问题。我只是好奇这种变量和选项的组合是否可行,因为它看起来更干净,更“语义”,而且对我来说更有条理,而不仅仅是一堆引用其他变量的变量。 ..
希望我有道理!谢谢大家!
答案 0 :(得分:2)
在您所拥有的对象定义中,this
不会引用对象本身,因此您的对象声明将无法执行您想要的操作。
事实上,在this sample code中,您可以看到该对象定义中的this
是window
对象,这是javascript解释器在没有其他对象时将其设置为的对象它本应具有的价值。
我不明白你为什么要做你正在做的事情(所以我不能建议更好的替代方案),但是你可以用{{1}这样做最终得到这样的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});
答案 1 :(得分:2)
this
仅在execution context
中有意义。定义函数时,将为该函数创建一个作用域链,只要该函数进入当前执行上下文,就会使用该作用域链。发生这种情况时,将this
定义(在运行时)。有关详细信息,请参阅this。
在您的示例中,您没有定义任何新的范围链,因为您没有在对象上创建任何方法。因此,当您引用this
时,无论您何时创建this
对象,都指的是foo
。最有可能的是,您正在全球空间工作,因此this
将是window
(如果您在浏览器中),但它可能是另一个具有您当前正在执行的功能的对象例如:
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
你可以做的是为你的对象使用make构造函数,并使用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});