在jQuery中引用变量中的选项

时间:2011-11-13 15:45:01

标签: javascript jquery variables plugins options

只是好奇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将获得“嘿,你今天做得怎么样”。

填充插件很难解释,但相信我的工作很好而不是问题。我只是好奇这种变量和选项的组合是否可行,因为它看起来更干净,更“语义”,而且对我来说更有条理,而不仅仅是一堆引用其他变量的变量。 ..

希望我有道理!谢谢大家!

2 个答案:

答案 0 :(得分:2)

在您所拥有的对象定义中,this不会引用对象本身,因此您的对象声明将无法执行您想要的操作。

事实上,在this sample code中,您可以看到该对象定义中的thiswindow对象,这是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});