摘要:起源通過實現(xiàn)代碼代碼執(zhí)行后,縮放瀏覽器,此時彈窗顯示。不符合預(yù)期代碼分析按常理,綁定事件后,將會丟失所指向的上下文,所以第一個代碼執(zhí)行的結(jié)果是。源碼分析可以看到在實例上綁定的方法,都是被處理過的。
起源 通過 Class 實現(xiàn)代碼
class Demo { constructor() { this.num = 1 this.init() } resize() { alert(this.num) } init() { window.addEventListener("resize", this.resize) } } new Demo()
代碼執(zhí)行后,縮放瀏覽器,此時彈窗顯示 undefined。
符合預(yù)期!!
通過 Vue 實現(xiàn)的代碼import Vue from "vue" new Vue({ template: "", data: { num: 1 }, methods: { resize() { alert(this.num) } }, mounted() { window.addEventListener("resize", this.resize) } }).$mount("#app")
縮放瀏覽器,此時彈框顯示 1。
不符合預(yù)期!!
代碼分析按常理,綁定事件 this.resize 后,將會丟失 this 所指向的上下文,所以第一個代碼執(zhí)行的結(jié)果是 undefined。
因此猜想,在 Vue 的實現(xiàn)版本中,綁定是一定不是定義在 methods 下的 resize 方法。
源碼分析src/core/instance/state.js#L258
function initMethods (vm: Component, methods: Object) { const props = vm.$options.props for (const key in methods) { // ... vm[key] = methods[key] == null ? noop : bind(methods[key], vm) } }
可以看到在 Vue 實例上綁定的方法,都是被 bind 處理過的。
src/shared/util.js#L203
function polyfillBind (fn: Function, ctx: Object): Function { function boundFn (a) { const l = arguments.length return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx) } boundFn._length = fn.length return boundFn } function nativeBind (fn: Function, ctx: Object): Function { return fn.bind(ctx) } export const bind = Function.prototype.bind ? nativeBind : polyfillBind
由此可見, Vue 的實例調(diào)用的方法,是經(jīng)過 bind 后帶有上下文的新方法。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98580.html
摘要:開始研究核心代碼這個類首先是構(gòu)造函數(shù)看完上面的內(nèi)容大家應(yīng)該有點印象,上掛了和,是默認(rèn)的配置,顧名思義就是攔截器,目測包含了和兩種類型。喜歡就點個贊吧參考文章源代碼重點難點分析源代碼重點難點分析 axios是一個基于promise的http庫,支持瀏覽器和node端,最近我在做beauty-we的api設(shè)計,研讀一個成熟的http庫勢在必行,axios功能完整、api簡潔、注釋清晰,再適...
摘要:這種解決方式也是相當(dāng)優(yōu)雅,值得學(xué)習(xí)源碼解析系列源碼解析一準(zhǔn)備工作源碼解析二函數(shù)源碼解析三對象源碼解析四方法源碼解析五鉤子源碼解析六模塊源碼解析七事件處理個人博客地址 事件處理 我們在使用 vue 的時候,相信你一定也會對事件的處理比較感興趣。 我們通過 @click 的時候,到底是發(fā)生了什么呢! 雖然我們用 @click綁定在模板上,不過事件嚴(yán)格綁定在 vnode 上的 。 event...
摘要:在學(xué)習(xí)源碼的過程中,給我?guī)椭畲蟮木褪沁@個系列文章,于是決定基于這個系列文章談一下自己的理解。說明就算拋出了錯誤,部分的代碼也要繼續(xù)執(zhí)行,隨后再將錯誤往上層代碼拋。和都能保證其中一個成員拋出錯誤的時候,余下的能繼續(xù)執(zhí)行。 前言 React 是一個十分龐大的庫,由于要同時考慮 ReactDom 和 ReactNative ,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級非常深,閱讀...
摘要:項目地址和的區(qū)別其實和最大的區(qū)別就是多了一個虛擬,其他的區(qū)別都是很小的。 項目地址 Vue1和Vue2的區(qū)別 其實Vue1和Vue2最大的區(qū)別就是Vue2多了一個虛擬DOM,其他的區(qū)別都是很小的。所以理解了Vue1的源碼,就相當(dāng)于理解了Vue2,中間差了一個虛擬DOM的Diff算法 文檔 數(shù)據(jù)雙向綁定 Vue主流程走向 組件 nextTick異步更新 MVVM 先來科普一下MVVM...
摘要:沒有具體對應(yīng)源碼分析,只是閱讀源碼的筆記,等之后學(xué)好點再寫成文章,構(gòu)造生成的。帶指令的所有元素,通過獲取,涉及,返回屬性選擇器對里的進(jìn)行綁定處理節(jié)點提取所有,返回數(shù)組,元素是對象,包含。 沒有具體對應(yīng)源碼分析,只是閱讀源碼的筆記,等之后學(xué)好點再寫成文章 Vue self,構(gòu)造生成的this。 root根元素。 els帶指令的所有元素,通過querySelectorAll獲取,涉及ge...
閱讀 2927·2021-11-24 09:39
閱讀 3610·2021-11-22 13:54
閱讀 3414·2021-11-16 11:45
閱讀 2439·2021-09-09 09:33
閱讀 3199·2019-08-30 15:55
閱讀 1296·2019-08-29 15:40
閱讀 924·2019-08-29 15:19
閱讀 3400·2019-08-29 15:14