成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從 jQuery 源碼中學(xué)到一個(gè)有意思的設(shè)計(jì)模式

開(kāi)發(fā)
世界上最大的電商網(wǎng)站 amazon 居然還在用 jQuery 。

大家好,我是 ??ConardLi?? ,今天發(fā)現(xiàn)個(gè)有意思的事。

世界上最大的電商網(wǎng)站 ??amazon?? 居然還在用 ??jQuery?? 。

好奇的我又去翻了翻 ??jQuery?? 的源碼,發(fā)現(xiàn)了下面這個(gè)奇妙的寫(xiě)法:

var elemData = initialValue
...
elemData.events = elemData = function(){};
...
elemData.events = {};

為了簡(jiǎn)單理解,這里省略了很多代碼,完整源碼:http://code.jquery.com/jquery-1.4.3rc1.js

初看還有點(diǎn)奇怪, ??elemData.events?? 為啥被賦值了兩次?后面的賦值肯定會(huì)把前面覆蓋掉?。窟@怕不會(huì)是個(gè) Bug 吧?

仔細(xì)想了下不對(duì), ??jQuery?? 都已經(jīng)穩(wěn)定運(yùn)行十幾年了,哪還來(lái)的 ??Bug?? ?下面我們仔細(xì)分析下...

賦值操作也屬于表達(dá)式

給變量賦值是我們代碼里最常見(jiàn)的寫(xiě)法,但是你可能會(huì)忽略一點(diǎn),賦值也屬于一種表達(dá)式,這種表達(dá)式計(jì)算的值是賦值右側(cè) ( ??RHS?? ) 的值。比如下面的代碼:

let x
if(x = 1) { // 1 is truthy
console.log(1) // 1
}

而且賦值運(yùn)算符 ??=?? 是右結(jié)合的:

let a, b
a = b = 2 // the same as a = ( b = 2)
console.log(a) // 2
console.log(b) // 2

運(yùn)算符的優(yōu)先級(jí)

回到前面那段令人費(fèi)解的 ??jQuery?? 代碼

elemData.events = elemData = function(){};

它包含兩種運(yùn)算符:兩個(gè)賦值運(yùn)算符和一個(gè)屬性訪問(wèn)運(yùn)算符( ??elemData.events?? )。

如果我們的一段代碼里有不同類(lèi)型的運(yùn)算符, ??運(yùn)算符優(yōu)先級(jí)表?? 會(huì)決定了哪種類(lèi)型的運(yùn)算符優(yōu)先運(yùn)算。

運(yùn)算符優(yōu)先級(jí)表:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table

 ??運(yùn)算符優(yōu)先級(jí)表?? 中我們得知:屬性訪問(wèn)運(yùn)算符的優(yōu)先級(jí)為 ??18?? ,而賦值運(yùn)算符只有 ??2?? ,這意味著屬性訪問(wèn)運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符。

比如 ??obj.name = 'ConardLi'?? 這段代碼,計(jì)算的第一個(gè)表達(dá)式是 ??obj.name?? ,解析為對(duì) ??name?? 屬性的引用,然后才是賦值操作。

剖析代碼

把前面提到的兩個(gè)知識(shí)點(diǎn)融合一下,我們?cè)诨仡櫹逻@段代碼:

var elemData = initialValue // 1
// ...
elemData.events = elemData = function(){}; // 2
// ...
elemData.events = {}; // 3
  • elemData
    initialValue
    elemData.events
    elemData = function(){}
  • elemData
    function (){}
    initialValue.events = function(){}
    elemData
    initialValue
  • 第 1 行非常簡(jiǎn)單。
  • 第 2 行:
  • 第 3 行:(new) ??elemData.events?? 屬性指向 ??{}??

可以看看下面這種圖的總結(jié):

這也讓我回想起 ??for in?? 循環(huán),當(dāng)我們?cè)谘h(huán)進(jìn)行到一半時(shí)改變對(duì)象的綁定(即給變量重新賦值),被枚舉的屬性不會(huì)直接改變,而是會(huì)等到循環(huán)結(jié)束后再變:

let obj = {a: 1, b: 2, c: 3}
let obj2 = {d: 1, e: 2, f: 3}

for(const prop in obj ) {
console.log(prop) // a, b, c
obj = obj2
}

console.log(obj) // { d: 1, e: 2, f: 3 }

實(shí)際應(yīng)用

這個(gè)模式挺巧妙的,其實(shí)我們很多業(yè)務(wù)場(chǎng)景的代碼都可以利用下這種寫(xiě)法,比如我們可以來(lái)實(shí)現(xiàn)個(gè)鏈表:

let i = 0, root = { index: i }, node = root

while (i < 10) {
node.next = node = {} // `node` in `node.next` is the old `node`
node.index = ++i // `node` in `node.index` is the new `node`
}

node = root
do {
console.log(node.index) // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
} while ((node = node.next))

可以看下面這張圖,其實(shí)是一樣的道理:

責(zé)任編輯:張燕妮 來(lái)源: code秘密
相關(guān)推薦

2018-06-24 16:39:28

Tomcat異常線(xiàn)程

2020-12-12 13:50:16

云開(kāi)發(fā)

2021-01-27 13:54:05

開(kāi)發(fā)云原生工具

2023-05-15 09:16:18

CSSCSS Mask

2012-05-22 10:12:59

jQuery

2024-05-20 01:10:00

Promise變量

2009-08-26 17:53:31

C# DropDown

2021-03-25 06:12:55

SVG 濾鏡CSS

2015-03-12 10:46:30

代碼代碼犯罪

2024-03-18 08:14:07

SpringDAOAppConfig

2013-08-19 12:46:27

2022-08-15 22:34:47

Overflow方向裁切

2022-06-15 07:21:47

鼠標(biāo)指針交互效果CSS

2021-02-20 16:01:26

Github前端開(kāi)發(fā)

2022-07-11 13:09:26

mmapLinux

2020-03-10 14:59:16

oracle數(shù)據(jù)庫(kù)監(jiān)聽(tīng)異常

2022-05-20 07:36:02

LiveTerm工具

2017-08-01 00:52:07

kafka大數(shù)據(jù)消息總線(xiàn)

2014-03-10 10:03:32

SaaS網(wǎng)站網(wǎng)站經(jīng)營(yíng)

2021-03-09 09:55:02

Vuejs前端代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 情侣酒店偷拍一区二区在线播放 | 国内精品视频在线观看 | 欧美一区二区 | 做a的各种视频 | 天堂色区 | 国产一级电影在线 | 色综合欧美 | 欧美在线不卡 | 日韩欧美专区 | 久久久久久久av麻豆果冻 | 美女黄网 | 亚洲第一成人影院 | 99re免费| 日一区二区三区 | 亚洲h在线观看 | 日日操网站 | 性国产xxxx乳高跟 | h在线 | 亚洲毛片 | 欧美国产精品久久久 | 国产一区二区 | 一级片免费在线观看 | 日日骚视频 | 精品国产乱码久久久久久蜜臀 | av黄色免费| 欧美又大粗又爽又黄大片视频 | 国产黄色一级片 | 免费在线观看成年人视频 | 久久精品二区亚洲w码 | 日韩成人免费视频 | 在线国产一区 | 亚洲成人精选 | 日韩中文在线观看 | 天天操,夜夜爽 | 在线视频国产一区 | 我要看黄色录像一级片 | 久久宗合色| 亚洲欧美日韩高清 | 亚洲精品视频在线播放 | 精品欧美乱码久久久久久 | 91免费在线 |