【问题标题】:Javascript and referencing one namespace property from another [duplicate]Javascript并从另一个[重复]引用一个命名空间属性
【发布时间】:2013-01-11 07:06:07
【问题描述】:

可能重复:
How can a Javascript object refer to values in itself?

假设我有:

var myNamespace = {
      _prop1: 'hello',
      _prop2: _prop1 + ' you!'
};

我刚刚发现这会在加载时在_prop2 上出错。

我不明白为什么这不起作用,我已经在我的代码中解决了这个问题,但我仍然想了解。

【问题讨论】:

  • 请记住,您声明的内容直到最后的 }; 才真正存在;在上面的代码中,因为它没有被编译 - 所以你会得到的错误(_prop1 是未定义的)真的告诉你事情的全部真相!
  • 在 javascript 中,变量作用域的工作方式与在 C 或其他语言中略有不同。当你请求一个变量时,它会检查它是否在当前范围内被声明为 var (在相同的括号之间),或者它是否是全局对象的变量(浏览器上下文中的窗口)。这里 _prop1 没有在相同的上下文中声明为 var,因此无法访问。

标签: javascript namespaces


【解决方案1】:

当您尝试设置 prop2 时,对象尚未初始化,因此 prop1 和 mynamespace 的值都未定义。

有几种方法可以实现你想要的,一种方法是将 prop2 创建为一个函数,以便它可以动态获取 prop1 的值

var myNamespace = {
      _prop1: 'hello',
      _prop2: function(){ return this._prop1 + ' you!' }
};

另一种方法是在 myNamespace 初始化后设置 prop2

【讨论】:

    【解决方案2】:

    你必须使用这个:

    var myNamespace = {
        _prop1: 'hello'
    };
    myNamespace._prop2: myNamespace._prop1 + ' you!';
    

    【讨论】:

      【解决方案3】:

      你可以的

      var myNamespace = {
            _prop1: 'hello',
            _prop2: myNamespace._prop1 + ' you!'
      };
      

      我认为不可能在声明中以任何其他方式做到这一点(例如:使用“self”或“this”不起作用)

      【讨论】:

      • 其实我也试过了,但我仍然得到一个未定义的错误。这真的很奇怪。会不会是镀铬的?我会尝试其他浏览器并报告。
      • 不,Firefox 也没有
      • 如果你做了类似 var myNamespace = {}; myNamespace = { _prop1: '你好', _prop2: myNamespace._prop1 + '你!' };
      • 这个答案肯定行不通。根据 bfavaretto 的回答,您必须分两步进行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2011-09-26
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      相关资源
      最近更新 更多