91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Vue源碼中如何使用With

發布時間:2021-01-29 15:47:15 來源:億速云 閱讀:516 作者:小新 欄目:編程語言

這篇文章主要介紹在Vue源碼中如何使用With,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

with用于擴展一個語句的作用域鏈,但一般情況下不建議使用with語句,因為它可能是引起混淆錯誤和兼容性問題的根源。在Vue源碼中有使用with語句的功能點,因此在這里將簡介其功能,以助于閱讀框架源碼。

性能的利與弊

with語句可以在不造成性能損失的情況下,減少變量的長度。其造成的附加計算量很少。使用'with'可以減少不必要的指針路徑解析運算。但是在大部分情況下,即使不使用with,使用臨時變量來保存指針或者使用call,也能達到同樣的效果。

with語句使得程序在查找變量值時,都是先在指定的對象中查找。所以那些本來不是這個對象的屬性的變量,查找起來將會很慢。

示例

let obj = {
    a: 1,
    b: 2,
    c: 3
}
with(obj){
    console.log(a)    //1
    console.log(b)    //2
    console.log(c)    //3
}

這段代碼中,with關聯的obj對象,在with代碼塊中,每個變量都首選被認為是一個局部變量,如果這個局部變量與obj對象的某個屬性同名,則這個局部變量會指向obj對象屬性。

function fn(obj){
    with(obj){
        a = 1;
    }
}
let obj1 = {
    a: 2
}
let obj2 = {
    b: 3
}

fn(obj1);
console.log(obj1.a)     //1

fn(obj2)
console.log(obj2.a)     //undefined
console.log(a)          //1,變量a被泄漏到全局作用域鏈上

上例中,obj1存在a屬性,obj2沒有a屬性。fn(obj)接收一個obj形參,是一個對象引用,并執行了with(obj)。在with代碼塊的內部,對a實際上是一個引用,將1賦值給了a。

當傳遞obj2給with時,with所聲明的作用域就是obj2,從這個作用域下開始對a進行查詢。obj2的作用域、fn的作用域和全局作用域中都沒有查找到標識符a,因此在非嚴格模式下會自動在全局作用域創建一個全局變量,而嚴格模式下則會拋出ReferenceError錯誤。

性能降低

如果在代碼中使用了with,那么JS引擎在編譯階段只能簡單地假設關于標識符的判斷都將無效,因為編譯器也不能知道傳遞給with的作用域對象到底是誰。因此JS引擎在編譯階段進行的性能優化都將無效。最糟糕的情況,那就是如果出現了with,所有的優化都將變得無意義。最簡單的做法就是不做任何優化,那么運行起來一定會很慢,這將是無法避免的事實。

Vue中的with

Vue 在 compile 的時候,會把 template 生成對應的 render function,而這個 render function中又正好使用了with語句。按照上文來說,不建議使用with語句,為什么在Vue中又會使用到呢?

function render () {
  with (this) {
    return _c('p',{on:{"click":change}},[_c('span',[_v(_s(number))]),_v(" "),_c('span',     [_v(_s(name))])])
  }
}

因為with 的作用域和模板的作用域正好契合,可以極大地簡化模板編譯過程。而with的代碼量很少,把作用域的處理交給JS引擎來做也更可靠。當然,最理想的情況還是要去掉with的使用,預編譯的時候會自動把第一遍編譯生成的代碼進行一次額外處理,用完整的AST分析來處理作用域,把with拿掉,順便支持ES6語法。換句話說,如果用 webpack + vue 的時候,最終生成的代碼是沒有 with 的。

以上是“在Vue源碼中如何使用With”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德昌县| 雷波县| 徐汇区| 苗栗市| 尼勒克县| 南岸区| 辰溪县| 古交市| 六盘水市| 吉林省| 新和县| 北安市| 岳阳县| 永登县| 南乐县| 张掖市| 聂拉木县| 齐齐哈尔市| 木兰县| 栖霞市| 桃江县| 汉源县| 绿春县| 蓬溪县| 南郑县| 辉县市| 瑞丽市| 郎溪县| 本溪市| 张家口市| 武山县| 嵊州市| 栾城县| 太保市| 三明市| 合水县| 青田县| 黑水县| 巨鹿县| 德格县| 陇西县|