Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套Javascript对象时的作用域问题_Javascript_Scope - Fatal编程技术网

嵌套Javascript对象时的作用域问题

嵌套Javascript对象时的作用域问题,javascript,scope,Javascript,Scope,我正在编写一些Javascript代码,使用jQuery在浏览器中显示特殊格式的小部件。我已经取得了成功,但现在我正致力于重构我的代码,原因有两个 (1) 我希望能够多次轻松地使用该小部件,并有一个Javascript对象引用每个小部件。 (2) 我希望以正确的方式来实现这一点,这样我的代码就可以完全重用,并且不会缺少包含各种对象和函数的全局名称空间 我有一个作用域问题,我希望解决这个问题并提高我对Javascript作用域的理解。我已将此问题浓缩为一个小代码段,说明了我在做什么: func

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

(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();
我声明了一个返回对象的函数

但是,当我尝试执行函数
combines.dothiswice()
时,程序抛出一个错误,指出
doThis()
超出范围。如何引用组合范围内的函数
doThis
。doThisTwice

更新:感谢您回答我的问题:将函数
doThis()
中的
object.doThis()
替换为
doThis()
。这行得通,但我不明白为什么


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

这不在函数作用域中定义,因此它将遍历作用域链,但找不到它

你可以通过

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
dothiswice
仍将引用原始函数。

dothiswice
中,使用
对象.doThis()而不是
doThis()

您需要执行以下操作:

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.compositions.doThisTwice()


从外部作用域引用“theObject”来调用内部对象中的函数。

是的,JS就是这样。谷歌搜索Javscript范围和闭包。您将更好地了解作用域的工作原理。尝试使用原型从对象继承,或者将对象复制到另一个变量,这样它就不再工作了。如果只是通过变量引用对象,为什么首先需要
这个