【问题标题】:My method and function do the same thing, but only the function works?我的方法和函数做同样的事情,但只有函数有效?
【发布时间】:2020-07-12 20:54:08
【问题描述】:

函数和方法 DPS 做同样的事情,它们获取一个顶点(以及函数 DPS 的图形)并进行深度优先搜索并返回图形中的所有节点。 每当我调用方法 tree.DPS() 时,我都会收到错误

VM1267 graphs:37 Uncaught TypeError: Cannot read property 'adjacencyList' of undefined

这是第 37 行

let l = this.adjacencyList[0];

但是当我运行 DPS() 函数时,它工作正常。任何人都可以看到为什么? adjacencyList 是图的一个属性,它包含顶点作为键,值作为顶点对应的边作为列表。

DPS(vertex) {
visited = []
helper(vertex)
function helper(vertex) {
    visited.push(vertex)
    let l = this.adjacencyList[0];
    console.log(l)
    return l
    for (let i =0; i < l.length; i++ ) {
        if (!visited.includes(l[i])) {
            helper(l[i])
        }
    }
}
return visited
    
}
}

g = new Graph
g.addVertex('Tokyo')
g.addVertex('NYC')
g.addVertex('San Francisco')
g.addEdge('NYC','Tokyo')
g.addEdge('San Francisco','Tokyo')
g.addEdge('NYC','San Francisco')

function DPS(graph,vertex) {
    visited = []
    helper(vertex)
    function helper(vertex) {
        visited.push(vertex)
        let l = graph.adjacencyList[vertex];
        for (let i =0; i < l.length; i++ ) {
            if (!visited.includes(l[i])) {
                helper(l[i])
            }
        }
    }
    return visited

}
//DPS(g,'NYC') This works
g.DPS('NYC')

【问题讨论】:

  • 首先,您是否检查过this.adjacencyList 是一个数组,并且它至少有一个元素?例如,一个空数组将为this.adjacencyList[0] 返回undefined
  • 它肯定是一个数组,我检查了它,否则该功能将无法正常工作。
  • 好的,它是否也至少包含一个元素?如果没有,它将返回undefined
  • GraphGraph.DPS的定义是什么?该问题包括DPS(vertex)DPS(graph,vertex),但没有显示DPS 如何与Graph 的原型相关联...
  • 注意:未捕获的类型错误:无法读取未定义的属性。当传递给函数的操作数或参数与该运算符或函数预期的类型不兼容时,将引发 JavaScript TypeError。

标签: javascript data-structures


【解决方案1】:

看起来问题是范围问题。辅助函数无法访问 this.adjacencyList。要修复它,您可以在辅助函数之前执行let parent = this,然后使用parent.adjacencyList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2023-03-16
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多