常见的调试报错 - 错误: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问题就要看具体的场景了,这里难以说明什么规律