https://github.com/vuejs/vue/commit/91deb4fd910afd51137820f120d4c26d0a99e629
如这个 commit,其实就加了 1 句 const cloned = fns.slice()
放在这个 js 代码上下文里面,好像没有区别。
我看了一下 commit 所指向的 issue,也好像没有关联。自己找个项目去 vue 源码那里修改一下,对比一下,发现好像修改前后没有区别。
1
tikazyq 2020-08-08 11:50:56 +08:00
可读性
|
2
binux 2020-08-08 11:52:58 +08:00 via Android
fns 执行过程中会变?
|
3
xiangyuecn 2020-08-08 11:55:20 +08:00
加了 const cloned = 。。。 可读性比旧版差多了,slice 创建新数组,在这段代码里面一点意义都没有
|
4
LostPrayers 2020-08-08 11:56:44 +08:00
看 const , 应该还是为了防止 fns 被修改导致 循环提前结束吧, 玄学 js
|
5
xiangyuecn 2020-08-08 11:57:40 +08:00
撤回#3 😂 fns = invoker.fns 😂
|
6
BarZu 2020-08-08 11:59:35 +08:00
fix: multiple merged vnode hooks not invoked properly 人家标题已经告诉你修复了什么问题了
|
7
az22c OP 我把背景交代一下:
重新加载组件都是先更新好 fns 属性,然后 invoker 函数作为 DOM 绑定的回调函数会在未来执行,并且它是用到 fns 的。 ``` // [伪代码] 判断出用户在该组件添加 click 事件,将这些事件更新到 fns 数组中 dom.addEventListener('click', invoker() { // [伪代码] 用到 invoker.fns }) ``` 好像 2 楼 4 楼正解 @binux @LostPrayers |
9
tonytonychopper 2020-08-08 13:44:16 +08:00
这里只是把 fns 拷贝一份出来,否则其他代码可能会导致 fns 改变,进而影响这里的执行。
|
10
tonytonychopper 2020-08-08 13:44:52 +08:00
@tonytonychopper 如果不是这样,那这段代码就没啥意义。
|
11
lizz666 2020-08-08 14:26:17 +08:00
看了 #5 楼,估计这里就是拷贝一份出来,后面 fns 会被重新赋值,没去看 vue 源码
|
12
JayLin1011 2020-08-11 15:29:00 +08:00
不可变状态思想的浅应用,稳定状态更新。Vue 源码栈结构的相关操作涉及浅拷贝,要么是为了稳定目标对象,要么是为了缓存优化性能。
|