Closed
Description
Hello,
觉得可能是个bug,所以就直接用中文描述了。。
报错页面的逻辑有点复杂,没能抽出纯粹的Demo,但已查到直接原因。
出错场景还原如下:
var cbs = this.cbs
for (var i = 0, l = cbs.length; i < l; i++) {
cbs[i](value, oldValue)
}
- 代码执行到上面这段,cbs为
[update, update]
,l == cbs.length == 2
。 - 进入for循环,
i == 0
,执行第一个update
,执行后满足teardown的条件,进入_teardown()
。 _teardown()
中满足条件进入removeCb()
,然后执行cbs.splice(i, 1)
,cbs变为[update]
。- 回到最初的for循环,
i == 1, l == 2
,i<l == true
,遍历到第二个元素,但此时cbs的长度已变为1,cbs[1] == undefined
。 cbs[1] == undefined
被作为函数执行,浏览器报错。
相关代码的位置:
https://github.com/yyx990803/vue/blob/0.11.0-rc3/dist/vue.js#L2174
https://github.com/yyx990803/vue/blob/0.11.0-rc3/dist/vue.js#L2202
小结一下出错的条件:cbs长度>1,且非末位数组元素的执行触发了removeCb。
但不知update(value, oldValue)
在怎样的情况下会进入teardown逻辑,我再试试能不能抽出纯粹的Demo。
Metadata
Metadata
Assignees
Labels
No labels