常见的调试报错 - 错误:Cannot read property 'yyy' of undefined

  • 作者:KK

  • 发表日期:2016.11.10


错误原因

这种错误是这样发生的:

alert(window.xxx.yyy);
//或
var aa = window.xxx.yyy;

报错:Cannot read property 'xxx' of undefined

翻译:无法从undefined里读取xxx这个属性

代码的行为目的是获取window对象的xxx的yyy,通常来说window对象是肯定存在的,如果只访问window.xxx,根据错误:调用未定义的变量的经验,会直接返回undefined而不会报错

但这下是再从不存在的xxx里调用yyy属性,那它就会报这样的错了,错误消息其实也是非常直接的

但是注意alert(xxx.yyy);报的错误不是这样的,因为这个属于 错误:调用未定义的变量 此文章的错误论述范围

总结就是:从一个存在的存在的对象里调用一个 不存在的属性 的子属性会引发Cannot read property 'yyy' of undefined


排查思路

如果直接alert(yyy)就会说yyy is not defined报错,但不是本文章所说的报错,所以就排除了直接调用全局变量的可能性

我们已经可以将排查范围定位在存在对象.不存在的属性.目标属性这种代码上面了

如果代码是你自己写的,那你很快就能思考出为什么中间那个属性突然不存在了

如果不是你写的,则可以这样思考:报错语义是“从未定义的东西里读取yyy属性”,那意味着代码里起码有yyy这样的代码,则语法是.yyy,所以可以拿“.yyy”这个关键词去搜代码

其实我这几篇文章都说搜代码的话都是个下策,通常浏览器会告诉你第几行了,一点进去就看到报错位置,接下来要思考的就是:“yyy的前面那个东西怎么就成了undefined?

而进一步排查yyy前面的undefined问题就要看具体的场景了,这里难以说明什么规律