Javascript 如何在另一个键/值对中使用已定义的键

Javascript 如何在另一个键/值对中使用已定义的键,javascript,json,object,Javascript,Json,Object,我有一个javascript对象: return { AccDocs: { query: function() { ... }, deleteAndQuery: function() { ... AccDocs.query(); //Error: AccDocs is not defined } } } 但是,它返回一个错误,表示未定义AccDocs 如何实现这样的目标?使用thi

我有一个javascript对象:

return {
   AccDocs: {
      query: function() {
         ...
      },
      deleteAndQuery: function() {
         ...
         AccDocs.query(); //Error: AccDocs is not defined
      }
   }
}
但是,它返回一个错误,表示未定义
AccDocs


如何实现这样的目标?

使用
this
关键字:

return {
   AccDocs: {
      query: function() {
         ...
      },
      deleteAndQuery: function() {
         ...
         this.query(); //Here
      }
   }
}
this.query();

通过使用
关键字:

return {
   AccDocs: {
      query: function() {
         ...
      },
      deleteAndQuery: function() {
         ...
         this.query(); //Here
      }
   }
}
this.query();

对象上的变量和属性是不同的。如果不指定要访问的对象,则无法访问对象的属性

您可能可以使用
this
关键字访问它:

return {
   AccDocs: {
      query: function() {
         ...
      },
      deleteAndQuery: function() {
         ...
         this.query(); //Here
      }
   }
}
this.query();
请记住,
this
的值将(当
a.b.c.d.AccDocs.deleteAndQuery()时)
被调用,
这个
内部的
删除和查询
将是
AccDocs
,因为它是最后一个
左边的第一个对象,但是如果您首先将
查询
复制到另一个变量,然后调用
查询()
,将其传递到
设置超时
,或者如果要使用
调用
应用
,则
的值将更改)

为了获得更高的健壮性(但灵活性较低,因为能够更改上下文可能很有用),您可以将对象存储在一个可以通过名称访问的变量中

var AccDocs = {
    query: function() {
            ...
    },
    deleteAndQuery: function() {
            ...
        AccDocs.query();
    }
};

return { AccDocs: AccDocs };

对象上的变量和属性是不同的。如果不指定要访问的对象,则无法访问对象的属性

您可能可以使用
this
关键字访问它:

return {
   AccDocs: {
      query: function() {
         ...
      },
      deleteAndQuery: function() {
         ...
         this.query(); //Here
      }
   }
}
this.query();
请记住,
this
的值将(当
a.b.c.d.AccDocs.deleteAndQuery()时)
被调用,
这个
内部的
删除和查询
将是
AccDocs
,因为它是最后一个
左边的第一个对象,但是如果您首先将
查询
复制到另一个变量,然后调用
查询()
,将其传递到
设置超时
,或者如果要使用
调用
应用
,则
的值将更改)

为了获得更高的健壮性(但灵活性较低,因为能够更改上下文可能很有用),您可以将对象存储在一个可以通过名称访问的变量中

var AccDocs = {
    query: function() {
            ...
    },
    deleteAndQuery: function() {
            ...
        AccDocs.query();
    }
};

return { AccDocs: AccDocs };

顺便说一句,你要创建
循环引用
@ozil-这不会创建循环引用,即使它创建了:那又怎样?没有迹象表明任何代码将尝试递归处理它。顺便说一下,您将创建
循环引用
@ozil-这不会创建循环引用,即使它创建了循环引用:那又怎样?没有迹象表明任何代码将试图递归地处理它。@RomanPerekhrest-当然它将返回未定义的,其中没有返回语句。我怀疑您的意思是
this.query
的值将未定义。这是可能的,但取决于函数的调用方式。给定调用它的最可能的代码,它将正常工作,
将是
AccDocs
属性的值。典型情况是调用
something.AccDocs.deleteAndQuery()
(例如,与
something.AccDocs.deleteAndQuery.call(something)
相反)@RomanPerekhrest-当然它将返回未定义的,其中没有返回语句。我怀疑您的意思是
this.query
的值将未定义。这是可能的,但取决于函数的调用方式。给定最有可能调用它的代码,它将正常工作,
将是
AccDocs
属性的值。典型情况是调用
something.AccDocs.deleteAndQuery()
(例如,与
something.AccDocs.deleteAndQuery.call(something)
)相反,该死。好的,你今天赢了。我将删除我的帖子。今天不是我的幸运日该死的。好的,你今天赢了。我将删除我的帖子。今天不是我的幸运日