直接回答:JS 里绝大多数报错都能归到三类:取值时对象是空的、闭包捕获了循环变量、把异步结果当同步用;看到报错先判断属于哪一类,再去看那一段代码。
1. 对象为空,操作对象属性会报错
1 2
| var obj={}; obj.aaa // 此时得到的是underfined,如果再对aaa进行操作就会报错
|
2.在循环中声明的函数包含对变量的不安全引用“initId”
Function declared in a loop contains unsafe references to variable(s) 'initId'
今天遇到一个问题,下面代码eslint报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const dMap = new Map(); list.forEach((i) => { dMap.set(i.parent, i.id); }); let haveParent = true; let l = [...list]; let initId = initData.id; l = l.filter((i) => i.id !== initId); while (haveParent) { initId = dMap.get(initId); if (!t1) { haveParent = false; } else { l = l.filter((i) => i.id !== initId); /** 这里报错,原因猜测initId是在while循环外定义的, 在循环中的函数在使用到initId的时候有可能在循环外 被其他地方修改到 **/ } }
|
修改成如下不再报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const dMap = new Map(); list.forEach((i) => { dMap.set(i.parent, i.id); }); let haveParent = true; let l = [...list]; let initId = initData.id; l = l.filter((i) => i.id !== initId); while (haveParent) { const c = dMap.get(initId); if (!t1) { haveParent = false; } else { l = l.filter((i) => i.id !== c); } initId = c }
|
3.RefereneError和TypeError
RefereneError表示变量未声明就使用了
TypeError表示作用域判别成功了,也就是找到了变量,但是对结果的操作不合理
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。