1.Vue.nextTick的内部逻辑在初始化Vue全局API的initGlobalAPI(Vue)实现中,Vue.nextTick是这样定义的。functioninitGlobalAPI(Vue){//...Vue.nextTick=nextTick;}可见直接将nextTick函数赋给Vue.nextTick非常简单。2.vm.$nextTickVue.prototype.$nextTick=function(fn){returnnextTick(fn,this)}的内部逻辑;可见vm.$nextTick内部也调用了nextTick函数。3.前置知识nextTick函数的作用可以理解为传入函数的异步执行。这里先介绍一下什么是异步执行,从JS的运行机制说起。1、JS运行机制JS的执行是单线程的。所谓单线程就是事件任务必须排队执行。下一个任务只有在上一个任务完成后才会执行。这是一个同步任务。为了避免上一个任务执行的时间还没有结束,下一个任务就无法执行,引入了异步任务的概念。JS运行机制可以简单的按照以下步骤进行。所有的同步任务都在主线程上执行,形成一个执行上下文栈。除了主线程之外,还有一个任务队列(taskqueue)。只要异步任务有运行结果,它的回调函数就会作为任务加入到任务队列中。一旦执行栈中的所有同步任务都执行完毕,就会读取任务队列,查看其中有哪些任务,添加到执行栈中,并执行。主线程不断重复上面的第三步。它通常被称为事件循环(EventLoop)。2.异步任务类型nextTick函数异步执行传入函数,属于异步任务。有两种类型的异步任务。主线程的执行过程是一个tick,所有的异步任务都是通过任务队列一个一个执行的。每个任务都存储在任务队列中。规范规定任务分为宏任务和微任务两类,每个宏任务结束后必须清除所有微任务。用一段代码直观地介绍任务的执行顺序。对于(macroTaskQueue的macroTask){handleMacroTask();for(microTaskQueue的microTask){handleMicroTask(microTask);}}在浏览器环境下,常用的宏任务创建方法有setTimeout、setInterval、postMessage、MessageChannel(队列优先于setTimeiout执行)网络请求IO页面交互:DOM、鼠标、键盘、滚动事件页面渲染常用创建方法微任务Promise.thenMutationObserveprocess.nexttick中的nextTick函数使用这些方法来处理函数通过参数cb传入的异步任务。3.nextTick函数varcallbacks=[];varpending=false;函数nextTick(cb,ctx){var_resolve;callbacks.push(function(){if(cb){try{cb.call(ctx);}catch(e){handleError(e,ctx,'nextTick');}}elseif(_resolve){_resolve(ctx);}});如果(!pending){pending=true;定时器功能();}if(!cb&&typeofPromise!=='undefined'){returnnewPromise(function(resolve){_resolve=resolve;})}}可以看到在nextTick函数中,函数通过参数cb传入被打包然后推入回调数组。然后使用变量pending来确保timerFunc()在一个事件循环中只执行一次。最后如果执行(!cb&&typeofPromise!=='undefined'),判断参数cb不存在,浏览器支持Promise,则返回一个Promise类实例化对象。比如nextTick().then(()=>{}),当_resolve函数执行时,then逻辑就会执行。让我们看一下timerFunc函数的定义。首先,我们将只使用Promise创建一个异步执行的ztimerFunc函数。Vue源码相关视频讲解:进入学习vartimerFunc;if(typeofPromise!=='undefined'&&isNative(Promise)){varp=Promise.resolve();timerFunc=function(){p.then(flushCallbacks);如果(isIOS){setTimeout(noop);}};}发现timerFunc函数是用各种异步执行方式调用flushCallbacks函数。看一下flushCallbacks函数varcallbacks=[];varpending=false;functionflushCallbacks(){pending=false;var副本=callbacks.slice(0);回调.length=0;对于(vari=0;i
