gpt4 book ai didi

javascript - 递归 JavaScript 方法范围

转载 作者:行者123 更新时间:2023-11-30 10:33:57 25 4
gpt4 key购买 nike

我有这个递归函数,它假设通过一个 JSON 对象来查找所有子组。这是我所拥有的:

var subgroupIds = [];
this.getSubGroups = function (groupId) {
this.getGroups("groupId="+groupId, function(groups) {
if ($.isEmptyObject(groups)) {
return subgroupIds;
} else {
$.each(groups, function(index,group) {
subgroupIds.push(group.id);
this.getSubGroups(group.id);
});
}
});
}

...其中 getGroups 是返回所有组的异步函数。

我的问题是当它到达递归调用时,我得到的错误是:

Uncaught TypeError: Object #<Object> has no method 'getSubGroups' 

我猜这是一个范围问题,但我无法弄清楚它有什么问题。有什么想法吗?

编辑:

正如 Bergi 指出的,我需要回调。这就是我现在拥有的:

var subgroupIds = [];
var that = this;
this.getSubGroups = function (groupId,callback) {
this.getGroups("groupId="+groupId, function(groups) {
if ($.isEmptyObject(groups)) {
return;
} else {
$.each(groups, function(index,group) {
subgroupIds.push(group.id);
callback(group.id);
that.getSubGroups(group.id);
});
}
});
}

现在的麻烦是当我调用回调时,它说函数未定义。

最终,我想返回一个子组 id 数组。我不确定如何到达那里...

最佳答案

这是因为 this 是在函数级别定义的,并且在本例中绑定(bind)到您为内部函数迭代的数组中的项目。内部函数中的 this 与外部函数中的 this 引用的不是同一个东西。您可以通过设置来解决这个问题var that = this; 在外层,在内部函数中引用 that

var subgroupIds = [];
var that = this;
this.getSubGroups = function (groupId) {
this.getGroups("groupId="+groupId, function(groups) {
if ($.isEmptyObject(groups)) {
return subgroupIds;
} else {
$.each(groups, function(index,group) {
subgroupIds.push(group.id);
that.getSubGroups(group.id);
});
}
});
}

有关更多信息,请参阅 How do closures work

这里是 How this works in JS

关于javascript - 递归 JavaScript 方法范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com