【问题标题】:Question about "this" in JavaScript关于 JavaScript 中“this”的问题
【发布时间】:2011-04-10 20:28:36
【问题描述】:

这可能是一个新手问题。我已经使用 javascript 多年,但只是开始“认真”对待它。我有一个关于“这个”的问题

var defaults = {
    baseId : 'item_',
    baseName : this.baseId
}

console.log('defaults',defaults);

不确定为什么 defaults.baseName 是“未定义的” 如何引用花括号中的内容?有可能吗,还是我真的必须输入两次'item_'?

【问题讨论】:

标签: javascript object scope this curly-braces


【解决方案1】:

简单的答案是你不能做你想做的事。在对象字面量的解析/解释/评估(无论您想如何考虑)期间,它不存在,因此不能以任何方式引用它。

【讨论】:

    【解决方案2】:

    JavaScript 对象字面量是一种语法糖,因此它不起作用。

    this; // at point A
    var defaults = {
        baseId : 'item_',
        baseName : this.baseId
    }
    

    翻译成

    this; // point A
    var defaults = new Object();
    defaults.baseId = 'item_';
    defaults.baseName = this.baseId; // "this" here is same as "this" at point A
    

    您可以使用 getter 和 setter。

    {
       baseId: 'item_',
       get baseName() { return this.baseId; },
       set baseName(x) { this.baseId = x }
    }
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      var defaults = {};
      defaults.baseId = defaults.baseName = 'item_';
      

      【讨论】:

        【解决方案4】:

        您可以改用function,创建class 的等效项:

        function defaults() {
           this.baseId = 'item_';
           this.baseName = this.baseId;
        }
        

        现在this 将拥有正确的上下文。

        另一种选择,使用您的原始代码,将baseName 设为函数:

        var defaults = {
            baseId : 'item_',
            baseName : function() { return  this.baseId; }
        };
        

        感谢 Šime Vidas 的更正!

        【讨论】:

        • 您不必写defaults 两次。你可以写:return this.baseId;
        猜你喜欢
        • 2011-09-17
        • 2011-02-01
        • 1970-01-01
        • 2021-02-27
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多