直接回答: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表示作用域判别成功了,也就是找到了变量,但是对结果的操作不合理

这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!