最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript之with的使用(阿里云、淘寶使用代碼分析)

 更新時(shí)間:2016年10月11日 14:36:49   投稿:mdxy-dxy  
這篇文章主要介紹了javascript之with的使用(阿里云、淘寶使用代碼分析),主要是發(fā)現(xiàn)了阿里云使用了這段比較有B格的代碼,所以說下這個(gè)怎么樣

記得還在懵懂學(xué)習(xí)JavaScript基礎(chǔ)之時(shí),坊間便有傳言“with語句是低效率語句,若非必要,請不要使用該語句”,同時(shí), ECMAScript 5 的strict mode下是禁止使用with語句的,所以一直以來我對with語句一直沒啥好感。

今天在知乎有個(gè)話題大概說的是“你覺得什么東西相當(dāng)有B格”之類的,然后就有人貼了這段代碼:

with(document)with(body)with(insertBefore(createElement("script"), firstChild))setAttribute("exparams","category=&userid=68497352&aplus&yunid=", id = "tb-beacon-aplus", src = (location > "https" ? "http://s": "http://a") + ".tbcdn.cn/s/aplus_v2.js")

代碼拆解:

with(document)
with(body)
with(insertBefore(createElement("script"), firstChild))
setAttribute("exparams","category=&userid=68497352&aplus&yunid=",
id = "tb-beacon-aplus",
src = (location > "https" ? "http://s": "http://a") + ".tbcdn.cn/s/aplus_v2.js"
)

再拆開

var script = document.createElement("script");
document.body.insertBefore(script, document.body.firstChild);

script.setAttribute("exparams","category=&userid=68497352&aplus&yunid=",
script.id = "tb-beacon-aplus",
script.src = (location > "https" ? "http://s": "http://a") + ".tbcdn.cn/s/aplus_v2.js"
);

因?yàn)樵?JavaScript 里,可以給函數(shù)多傳一些無用參數(shù)的。
因此,最后這句話完全可以理解為:
script.id = "tb-beacon-aplus";
script.src = (location > "https" ? "http://s": "http://a") + ".tbcdn.cn/s/aplus_v2.js";
script.setAttribute("exparams","category=&userid=68497352&aplus&yunid=");

如果賦值的不是標(biāo)準(zhǔn)屬性,就不會寫出到標(biāo)簽的 attribute 里了,所以分開賦值能讓加載的外部腳本讀取到這里的附加參數(shù)。

據(jù)說是淘寶首頁的,好奇心使然,果斷跑去淘寶看了下,有圖有真相哪:

淘寶這種大項(xiàng)目一般是十分講究效率的,居然會使用傳說中的低效率代碼?

我們試著用正常代碼來達(dá)到上面的功能:

var s = document.createElement("script");
s.setAttribute("exparams","category=&userid=68497352&aplus&yunid=");
s.setAttribute("src",(location>"https"?"http://s":"http://a")+".tbcdn.cn/s/aplus_v2.js");
s.id="tb-beacon-aplus";
document.body.insertBefore(s,document.body.firstChild)

這是我能寫出的最簡單的代碼了,當(dāng)然,您可以嘗試像淘寶那代碼一樣setAttribute,不過結(jié)果會讓你很受傷?。。〗?jīng)過我的測試,他那樣帶3個(gè)以上的參數(shù)設(shè)置節(jié)點(diǎn)屬性僅在with語句下有效,而且第三個(gè)及以后參數(shù)所設(shè)置的屬性只能是HTML標(biāo)準(zhǔn)屬性。原因我也不知道,有大牛愿意指教么?

代碼壓縮后,淘寶代碼224字節(jié),我寫的代碼264字節(jié)。

我得出的結(jié)論是:大的網(wǎng)站惜字節(jié)如金,特別是像淘寶這種每天流量巨大的網(wǎng)站,為了節(jié)省流量(別看只有幾個(gè)字節(jié),乘以個(gè)大的訪問量后結(jié)果還是挺驚人的)而稍微犧牲下用戶代碼運(yùn)行的效率是完全值得的。況且,在瀏覽器代碼執(zhí)行效率日新月異的今天,with語句效率真有那么低么?

秉承一顆探索的心(此刻內(nèi)心略為激動。。),做了如下代碼測試,

html代碼:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <div id="one" data="test data"></div>
</body>
</html>

with語句獲取div#data值

var now = +new Date;
for(var i=0;i<1000000;i++){
   with(document)with(getElementById("one"))getAttribute("data")
}
console.log(new Date-now)

一般代碼獲取div#one的data值

var now = +new Date;
for(var i=0;i<1000000;i++){
   document.getElementById("one").getAttribute("data")
}
console.log(new Date-now)

獲取屬性值的代碼均循環(huán)運(yùn)行100W次,輸出運(yùn)行時(shí)間,測試瀏覽器為Chrome 35與IE 11:

申明:誰特么說我是IE黑,我和誰急?。。?/p>

Chrome 35 數(shù)值單位:ms
第1次 第2次 第3次 第4次 第5次 第6次 第7次 第8次 第9次 第10次 平均值 10W次差值 單次差值
一般代碼 1362 1358 1379 1377 1372 1411 1371 1341 1356 1339 1366.6 888.7 0.89μs

IE 11 單位:ms
第1次 第2次 第3次 第4次 第5次 第6次 第7次 第8次 第9次 第10次 平均值 10W次差值 單次差值
正常情況 2352 2332 2321 2347 2342 2339 2365 2373 2353 2343 2346.7 861.7 0.86μs

由于其它軟件運(yùn)行的影響及兩種代碼運(yùn)行的先后順序,結(jié)果可能不是十分嚴(yán)謹(jǐn),但個(gè)人認(rèn)為還是不會影響我們得出最終的結(jié)論:with語句在不是嵌套十分復(fù)雜的情況下,相比于一般代碼對執(zhí)行效率的影響其實(shí)微乎其微。

我想ECMAScript 5 的strict mode下禁用with語句的主要原因應(yīng)該是with語句讓個(gè)對象與方法與屬性的關(guān)系變得更模糊, 不利于JavaScript向面向?qū)ο缶幊炭繑n吧。

腳本之家小編補(bǔ)充:雖然有B格但不論是易于閱讀還是考慮性能的目的,很多網(wǎng)站還是使用普通的方式加載。

相關(guān)文章

  • javascript引用賦值(地址傳值)用法實(shí)例

    javascript引用賦值(地址傳值)用法實(shí)例

    這篇文章主要介紹了javascript引用賦值(地址傳值)用法,以一個(gè)簡單實(shí)例分析了javacript引用賦值的原理與用法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 使用console進(jìn)行性能測試

    使用console進(jìn)行性能測試

    各大瀏覽器內(nèi)置的開發(fā)工具,都提供了一個(gè)console對象。它主要有兩個(gè)作用:顯示網(wǎng)頁代碼運(yùn)行時(shí)的錯(cuò)誤信息。提供了一個(gè)命令行接口,用來與網(wǎng)頁代碼互動。下面我們就來詳細(xì)研究下如何使用console進(jìn)行性能測試。
    2015-04-04
  • 使用nestjs實(shí)現(xiàn)郵件發(fā)送的代碼詳解

    使用nestjs實(shí)現(xiàn)郵件發(fā)送的代碼詳解

    郵箱發(fā)送是我們常見的一個(gè)服務(wù),本篇文章帶大家用nestjs來實(shí)現(xiàn)一下,文中有詳細(xì)的代碼示例和圖文講解,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • 詳解微信小程序軌跡回放實(shí)現(xiàn)及遇到的坑

    詳解微信小程序軌跡回放實(shí)現(xiàn)及遇到的坑

    這篇文章主要介紹了詳解微信小程序軌跡回放實(shí)現(xiàn)及遇到的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 腳本控制自適應(yīng)高度的縮短問題

    腳本控制自適應(yīng)高度的縮短問題

    腳本控制自適應(yīng)高度的縮短問題...
    2007-10-10
  • 純js實(shí)現(xiàn)手風(fēng)琴效果代碼

    純js實(shí)現(xiàn)手風(fēng)琴效果代碼

    這篇文章主要為大家詳細(xì)介紹了純js實(shí)現(xiàn)手風(fēng)琴效果代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JavaScript encodeURI 和encodeURIComponent

    JavaScript encodeURI 和encodeURIComponent

    encodeURI和encodeURIComponet函數(shù)都是javascript中用來對URI進(jìn)行編碼,將相關(guān)參數(shù)轉(zhuǎn)換成UTF-8編碼格式的數(shù)據(jù)。URI在進(jìn)行定位跳轉(zhuǎn)時(shí),參數(shù)里面的中文、日文等非ASCII編碼都會進(jìn)行編碼轉(zhuǎn)換
    2015-12-12
  • JavaScript的new date等日期函數(shù)在safari中遇到的坑

    JavaScript的new date等日期函數(shù)在safari中遇到的坑

    safari中對于JavaScript的new Date函數(shù)的支持有一個(gè)比較奇怪的問題,帶著這個(gè)奇怪的問題我們通過本文一起學(xué)習(xí)吧
    2016-10-10
  • Bootstrap實(shí)現(xiàn)可折疊分組側(cè)邊導(dǎo)航菜單

    Bootstrap實(shí)現(xiàn)可折疊分組側(cè)邊導(dǎo)航菜單

    這篇文章主要介紹了Bootstrap實(shí)現(xiàn)可折疊分組側(cè)邊導(dǎo)航菜單的相關(guān)資料,需要的朋友可以參考下
    2018-03-03
  • input禁止鍵盤及中文輸入,但可以點(diǎn)擊

    input禁止鍵盤及中文輸入,但可以點(diǎn)擊

    這篇文章主要介紹了<input>禁止鍵盤及中文輸入,但可以點(diǎn)擊。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02

最新評論

沽源县| 阿克苏市| 平罗县| 昔阳县| 张掖市| 商丘市| 沿河| 中牟县| 土默特右旗| 长岛县| 日土县| 壤塘县| 铜陵市| 永善县| 连江县| 永定县| 乌苏市| 观塘区| 博爱县| 临颍县| 日土县| 星子县| 曲靖市| 友谊县| 五台县| 家居| 长岛县| 板桥市| 南乐县| 田东县| 滦南县| 垫江县| 曲阳县| 阿尔山市| 开封县| 锡林浩特市| 韶山市| 盘锦市| 阿图什市| 丰台区| 海淀区|