范围问题嵌套Javascript对象

时间:2011-06-24 14:59:18

标签: javascript scope

我正在使用jQuery编写一些Javascript代码,以在浏览器中显示特殊格式的小部件。我已经取得了成功,但现在我正在努力重构我的代码有两个原因。

(1)我希望能够轻松地多次使用窗口小部件,并且每个窗口都有一个Javascript对象。
(2)我希望以正确的方式做到这一点,这样我的代码完全可以重复使用,并且对于具有各种对象和函数的全局命名空间并不多。

我遇到了一个范围问题,我希望解决问题并提高我对Javascript范围的理解。我把这个问题简化为一个很小的代码片段,说明了我在做什么:

  function getMyObject() {
      var theObject = {
          doThis: function () { },
          doThat: function () { },
          combinations: {
              doThisTwice: function () { doThis(); doThis(); },
              doThatTwice: function () { doThat(); doThat(); }
          }
      };
      return theObject;
  }

  var myObject = getMyObject();
  myObject.combinations.doThisTwice();

我已经声明了一个返回对象的函数。

但是,当我尝试执行函数combinations.doThisTwice()时,程序会抛出一个错误,指出doThis()超出了范围。如何在doThis范围内引用函数combinations.doThisTwice

更新:非常感谢您回答我的问题:在doThis()函数中将theObject.doThis()替换为doThisTwice()。这有效,但我不明白为什么。

我原以为名称theObject在对象声明结束之前无效。我想我必须误解Javascript的一些基本方面......可能是因为类似C语法。

3 个答案:

答案 0 :(得分:2)

doThis未在函数范围中定义,因此它将遍历范围链,但找不到它。

您可以通过

引用它
theObject.doThis();

但是,如果您定义这样的函数,可能会更具可读性:

  function getMyObject() {
      function doThis() {};
      function doThat() {};

      var theObject = {
          doThis: doThis,
          doThat: doThat,
          combinations: {
              doThisTwice: function () { doThis(); doThis(); },
              doThatTwice: function () { doThat(); doThat(); }
          }
      };
      return theObject;
  }

但在这种情况下,每当您从外部更改doThis时,doThisTwice仍将引用原始功能。

答案 1 :(得分:2)

你需要这样做:

function getMyObject() {
    var theObject = {
        doThis: function () { },
        doThat: function () { },
        combinations: {
            doThisTwice: function () { theObject.doThis(); theObject.doThis(); },
            doThatTwice: function () { theObject.doThat(); theObject.doThat(); }
        }
    };
    return theObject;
}

var myObject = getMyObject();   myObject.combinations.doThisTwice();

从外部作用域引用'theObject'以调用内部对象中的函数。

答案 2 :(得分:0)

doThisTwice中,使用theObject.doThis();代替doThis();