A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/vuejs/vue/issues/520 below:

更新到0.11.0-rc3后遇到`watcher.js`报错 · Issue #520 · vuejs/vue · GitHub

Hello,
觉得可能是个bug,所以就直接用中文描述了。。

报错页面的逻辑有点复杂,没能抽出纯粹的Demo,但已查到直接原因。

报错的截图如下:

出错场景还原如下:

    var cbs = this.cbs
    for (var i = 0, l = cbs.length; i < l; i++) {
        cbs[i](value, oldValue)
    }
  1. 代码执行到上面这段,cbs为[update, update]l == cbs.length == 2
  2. 进入for循环,i == 0,执行第一个update,执行后满足teardown的条件,进入_teardown()
  3. _teardown()中满足条件进入removeCb(),然后执行cbs.splice(i, 1),cbs变为[update]
  4. 回到最初的for循环,i == 1, l == 2i<l == true,遍历到第二个元素,但此时cbs的长度已变为1,cbs[1] == undefined
  5. 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。


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4