<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        理解javascript中的with關(guān)鍵字_javascript技巧

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 20:50:49
        文檔

        理解javascript中的with關(guān)鍵字_javascript技巧

        理解javascript中的with關(guān)鍵字_javascript技巧:說(shuō)起js中的with關(guān)鍵字,很多小伙伴們的第一印象可能就是with關(guān)鍵字的作用在于改變作用域,然后最關(guān)鍵的一點(diǎn)是不推薦使用with關(guān)鍵字。聽到不推薦with關(guān)鍵字后,我們很多人都會(huì)忽略掉with關(guān)鍵字,認(rèn)為不要去管它用它就可以了。但是有時(shí)候,我們?cè)诳匆恍┐a或者
        推薦度:
        導(dǎo)讀理解javascript中的with關(guān)鍵字_javascript技巧:說(shuō)起js中的with關(guān)鍵字,很多小伙伴們的第一印象可能就是with關(guān)鍵字的作用在于改變作用域,然后最關(guān)鍵的一點(diǎn)是不推薦使用with關(guān)鍵字。聽到不推薦with關(guān)鍵字后,我們很多人都會(huì)忽略掉with關(guān)鍵字,認(rèn)為不要去管它用它就可以了。但是有時(shí)候,我們?cè)诳匆恍┐a或者

        說(shuō)起js中的with關(guān)鍵字,很多小伙伴們的第一印象可能就是with關(guān)鍵字的作用在于改變作用域,然后最關(guān)鍵的一點(diǎn)是不推薦使用with關(guān)鍵字。聽到不推薦with關(guān)鍵字后,我們很多人都會(huì)忽略掉with關(guān)鍵字,認(rèn)為不要去管它用它就可以了。但是有時(shí)候,我們?cè)诳匆恍┐a或者面試題的時(shí)候,其中會(huì)有with關(guān)鍵字的相關(guān)問(wèn)題,很多坑是你沒(méi)接觸過(guò)的,所以還是有必要說(shuō)說(shuō)with這一個(gè)關(guān)鍵字。

        一、基本說(shuō)明

        在js高級(jí)程序設(shè)計(jì)中是這樣描述with關(guān)鍵字的:with語(yǔ)句的作用是將代碼的作用域設(shè)置到一個(gè)特定的作用域中,基本語(yǔ)法如下:

        使用with關(guān)鍵字的目的是為了簡(jiǎn)化多次編寫訪問(wèn)同一對(duì)象的工作,比如下面的例子:

        這幾行代碼都是訪問(wèn)location對(duì)象中的屬性,如果使用with關(guān)鍵字的話,可以簡(jiǎn)化代碼如下:

        在這段代碼中,使用了with語(yǔ)句關(guān)聯(lián)了location對(duì)象,這就以為著在with代碼塊內(nèi)部,每個(gè)變量首先被認(rèn)為是一個(gè)局部變量,如果局部變量與location對(duì)象的某個(gè)屬性同名,則這個(gè)局部變量會(huì)指向location對(duì)象屬性。
        注意:在嚴(yán)格模式下不能使用with語(yǔ)句。

        二、with關(guān)鍵字的弊端

        前面的基本說(shuō)明中,我們可以看到with的作用之一是簡(jiǎn)化代碼。但是為什么不推薦使用呢?下面我們來(lái)說(shuō)說(shuō)with的缺點(diǎn):

        1、性能問(wèn)題
        2、語(yǔ)義不明,調(diào)試?yán)щy

        三、性能問(wèn)題

        首先說(shuō)說(shuō)性能問(wèn)題,關(guān)于使用with關(guān)鍵字的性能問(wèn)題,首先我們來(lái)看看兩段代碼:

        第一段代碼是沒(méi)有使用with關(guān)鍵字:

        第二段代碼使用了with關(guān)鍵字:

        在使用了with關(guān)鍵字后了,代碼的性能大幅度降低。第二段代碼的with語(yǔ)句作用到了obj2這個(gè)對(duì)象上,然后with塊里面訪問(wèn)的卻是obj對(duì)象。有一種觀點(diǎn)是:使用了with關(guān)鍵字后,在with塊內(nèi)訪問(wèn)變量時(shí),首先會(huì)在obj2上查找是否有名為obj的屬性,如果沒(méi)有,再進(jìn)行下一步查找,這個(gè)過(guò)程導(dǎo)致了性能的降低。但是程序性能真正降低的原因真的是這樣嗎?
        我們修改一下第二段代碼,修改如下:

        這段代碼將with語(yǔ)句作用到了obj對(duì)象上,然后直接使用a訪問(wèn)obj的a屬性,按照前面說(shuō)到的觀點(diǎn),訪問(wèn)a屬性時(shí),是一次性就可以在obj上找到該屬性的,但是為什么代碼性能依舊降低了呢。
        真正的原因是:使用了with關(guān)鍵字后,JS引擎無(wú)法對(duì)這段代碼進(jìn)行優(yōu)化。
        JS引擎在代碼執(zhí)行之前有一個(gè)編譯階段,在不使用with關(guān)鍵字的時(shí)候,js引擎知道a是obj上的一個(gè)屬性,它就可以靜態(tài)分析代碼來(lái)增強(qiáng)標(biāo)識(shí)符的解析,從而優(yōu)化了代碼,因此代碼執(zhí)行的效率就提高了。使用了with關(guān)鍵字后,js引擎無(wú)法分辨出a變量是局部變量還是obj的一個(gè)屬性,因此,js引擎在遇到with關(guān)鍵字后,它就會(huì)對(duì)這段代碼放棄優(yōu)化,所以執(zhí)行效率就降低了。
        使用with關(guān)鍵字對(duì)性能的影響還有一點(diǎn)就是js壓縮工具,它無(wú)法對(duì)這段代碼進(jìn)行壓縮,這也是影響性能的一個(gè)因素。

        四、語(yǔ)義不明,難以調(diào)試

        前面說(shuō)到除了性能的問(wèn)題,with還存在的一個(gè)缺點(diǎn)語(yǔ)義不明,難以調(diào)試,就是造成代碼的不易閱讀,而且可能造成潛在的bug。

        這段代碼很容易理解了,在foo函數(shù)內(nèi),使用了with關(guān)鍵字來(lái)訪問(wèn)傳進(jìn)來(lái)的obj對(duì)象,然后修改a屬性。當(dāng)傳入o1對(duì)象時(shí),因?yàn)閛1對(duì)象存在著a屬性,所以這樣沒(méi)有問(wèn)題。傳入o2對(duì)象時(shí),在修改a屬性時(shí),由于o2對(duì)象沒(méi)有a這個(gè)屬性,所以被修改的a屬性則變成了全局變量。這就造成了潛在的bug。

        五、延伸分析

        前面說(shuō)了那么多,相信大家已經(jīng)理解了為什么不推薦使用with關(guān)鍵字以及可能存在的問(wèn)題。下面我們來(lái)看看一些更復(fù)雜的情況,看下面的代碼:

        在這段代碼中,分別輸出30,20,undefined的。涉及的知識(shí)點(diǎn)也比較多:with關(guān)鍵字,this關(guān)鍵字,變量提升等等,我們來(lái)一一解釋一下。
        1、this關(guān)鍵字
        關(guān)于this關(guān)鍵字的文章google上面相當(dāng)多,這里不再贅述,我們只需記住一點(diǎn):this關(guān)鍵字始終指向調(diào)用函數(shù)的對(duì)象。在這里,foo函數(shù)中,this指向的就是obj對(duì)象。因此在with(this)語(yǔ)句塊里面,可以直接通過(guò)x變量來(lái)訪問(wèn)obj的x屬性。
        2、變量提升
        js中的變量提升也是一個(gè)經(jīng)常遇到的問(wèn)題,我們可以簡(jiǎn)單理解成在js中,變量聲明會(huì)被提升到函數(shù)的頂部,盡管有的時(shí)候,它是在后面聲明的。

        所以上面的代碼可以解析為:

        輸出局部變量y, } } }; obj.foo(); console.log(obj.x);//20,obj.x已被修改為20 console.log(obj.y);//undefined,obj不存在y屬性,則為undefined

        上面的注釋中,解釋了代碼的執(zhí)行過(guò)程,相信大家已經(jīng)理解了為什么會(huì)出處30,20,undefined的原因。

        有興趣的同學(xué)可以看看下面這段代碼:

        這段代碼會(huì)輸出什么?為什么呢?

        總結(jié)

        本文總結(jié)了with語(yǔ)句的特點(diǎn)和弊端,總的來(lái)說(shuō),強(qiáng)烈不推薦使用with關(guān)鍵字。其實(shí)在日常編碼中,我們只需要知道不去使用with就可以了,但是有的時(shí)候我們可能會(huì)遇到一些關(guān)于with的奇奇怪怪的問(wèn)題,想要找出真正的原因,就要深入理解with關(guān)鍵字,這有助于我們?nèi)ド钊雽W(xué)習(xí)JS這門語(yǔ)言,同時(shí)也是學(xué)習(xí)JS的一個(gè)樂(lè)趣。

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        理解javascript中的with關(guān)鍵字_javascript技巧

        理解javascript中的with關(guān)鍵字_javascript技巧:說(shuō)起js中的with關(guān)鍵字,很多小伙伴們的第一印象可能就是with關(guān)鍵字的作用在于改變作用域,然后最關(guān)鍵的一點(diǎn)是不推薦使用with關(guān)鍵字。聽到不推薦with關(guān)鍵字后,我們很多人都會(huì)忽略掉with關(guān)鍵字,認(rèn)為不要去管它用它就可以了。但是有時(shí)候,我們?cè)诳匆恍┐a或者
        推薦度:
        標(biāo)簽: js 理解 javascript
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲13又紧又嫩又水多| 亚洲不卡av不卡一区二区| 一本色道久久88亚洲精品综合| 国产成人精品免费久久久久| 亚洲国产天堂在线观看| 精品成在人线AV无码免费看 | 国产亚洲精AA在线观看SEE| 国产97视频人人做人人爱免费| 亚洲精品国产va在线观看蜜芽| 国产国产人免费人成成免视频 | 91香蕉成人免费网站| 亚洲国产午夜电影在线入口| 免费无码AV电影在线观看| 亚洲国产综合AV在线观看| 国产伦一区二区三区免费 | 久久亚洲精品成人无码| 免费真实播放国产乱子伦| 一级做性色a爰片久久毛片免费| 国产精品亚洲综合专区片高清久久久| a高清免费毛片久久| 久久精品国产精品亚洲艾草网| 亚洲视频在线免费观看| 日韩亚洲人成在线| 四虎国产精品免费视| 二区久久国产乱子伦免费精品| 亚洲国产精品久久久久久| 毛片大全免费观看| 人妻免费久久久久久久了| 亚洲AV日韩AV高潮无码专区| 黄页网站免费观看| 午夜在线免费视频 | 久久久久久精品免费免费自慰| 亚洲а∨天堂久久精品9966| 免费一级毛片一级毛片aa| 中文字幕在线免费播放| 亚洲乱码中文字幕小综合| 午夜亚洲av永久无码精品| 色猫咪免费人成网站在线观看| 亚洲色成人网站WWW永久四虎| 国产亚洲精品AA片在线观看不加载| 91嫩草免费国产永久入口|