国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

理解javascript中的with關鍵字_javascript技巧

來源:懂視網 責編:小采 時間:2020-11-27 20:50:49
文檔

理解javascript中的with關鍵字_javascript技巧

理解javascript中的with關鍵字_javascript技巧:說起js中的with關鍵字,很多小伙伴們的第一印象可能就是with關鍵字的作用在于改變作用域,然后最關鍵的一點是不推薦使用with關鍵字。聽到不推薦with關鍵字后,我們很多人都會忽略掉with關鍵字,認為不要去管它用它就可以了。但是有時候,我們在看一些代碼或者
推薦度:
導讀理解javascript中的with關鍵字_javascript技巧:說起js中的with關鍵字,很多小伙伴們的第一印象可能就是with關鍵字的作用在于改變作用域,然后最關鍵的一點是不推薦使用with關鍵字。聽到不推薦with關鍵字后,我們很多人都會忽略掉with關鍵字,認為不要去管它用它就可以了。但是有時候,我們在看一些代碼或者

說起js中的with關鍵字,很多小伙伴們的第一印象可能就是with關鍵字的作用在于改變作用域,然后最關鍵的一點是不推薦使用with關鍵字。聽到不推薦with關鍵字后,我們很多人都會忽略掉with關鍵字,認為不要去管它用它就可以了。但是有時候,我們在看一些代碼或者面試題的時候,其中會有with關鍵字的相關問題,很多坑是你沒接觸過的,所以還是有必要說說with這一個關鍵字。

一、基本說明

在js高級程序設計中是這樣描述with關鍵字的:with語句的作用是將代碼的作用域設置到一個特定的作用域中,基本語法如下:

使用with關鍵字的目的是為了簡化多次編寫訪問同一對象的工作,比如下面的例子:

這幾行代碼都是訪問location對象中的屬性,如果使用with關鍵字的話,可以簡化代碼如下:

在這段代碼中,使用了with語句關聯了location對象,這就以為著在with代碼塊內部,每個變量首先被認為是一個局部變量,如果局部變量與location對象的某個屬性同名,則這個局部變量會指向location對象屬性。
注意:在嚴格模式下不能使用with語句。

二、with關鍵字的弊端

前面的基本說明中,我們可以看到with的作用之一是簡化代碼。但是為什么不推薦使用呢?下面我們來說說with的缺點:

1、性能問題
2、語義不明,調試困難

三、性能問題

首先說說性能問題,關于使用with關鍵字的性能問題,首先我們來看看兩段代碼:

第一段代碼是沒有使用with關鍵字:

第二段代碼使用了with關鍵字:

在使用了with關鍵字后了,代碼的性能大幅度降低。第二段代碼的with語句作用到了obj2這個對象上,然后with塊里面訪問的卻是obj對象。有一種觀點是:使用了with關鍵字后,在with塊內訪問變量時,首先會在obj2上查找是否有名為obj的屬性,如果沒有,再進行下一步查找,這個過程導致了性能的降低。但是程序性能真正降低的原因真的是這樣嗎?
我們修改一下第二段代碼,修改如下:

這段代碼將with語句作用到了obj對象上,然后直接使用a訪問obj的a屬性,按照前面說到的觀點,訪問a屬性時,是一次性就可以在obj上找到該屬性的,但是為什么代碼性能依舊降低了呢。
真正的原因是:使用了with關鍵字后,JS引擎無法對這段代碼進行優化。
JS引擎在代碼執行之前有一個編譯階段,在不使用with關鍵字的時候,js引擎知道a是obj上的一個屬性,它就可以靜態分析代碼來增強標識符的解析,從而優化了代碼,因此代碼執行的效率就提高了。使用了with關鍵字后,js引擎無法分辨出a變量是局部變量還是obj的一個屬性,因此,js引擎在遇到with關鍵字后,它就會對這段代碼放棄優化,所以執行效率就降低了。
使用with關鍵字對性能的影響還有一點就是js壓縮工具,它無法對這段代碼進行壓縮,這也是影響性能的一個因素。

四、語義不明,難以調試

前面說到除了性能的問題,with還存在的一個缺點語義不明,難以調試,就是造成代碼的不易閱讀,而且可能造成潛在的bug。

這段代碼很容易理解了,在foo函數內,使用了with關鍵字來訪問傳進來的obj對象,然后修改a屬性。當傳入o1對象時,因為o1對象存在著a屬性,所以這樣沒有問題。傳入o2對象時,在修改a屬性時,由于o2對象沒有a這個屬性,所以被修改的a屬性則變成了全局變量。這就造成了潛在的bug。

五、延伸分析

前面說了那么多,相信大家已經理解了為什么不推薦使用with關鍵字以及可能存在的問題。下面我們來看看一些更復雜的情況,看下面的代碼:

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

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

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

上面的注釋中,解釋了代碼的執行過程,相信大家已經理解了為什么會出處30,20,undefined的原因。

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

這段代碼會輸出什么?為什么呢?

總結

本文總結了with語句的特點和弊端,總的來說,強烈不推薦使用with關鍵字。其實在日常編碼中,我們只需要知道不去使用with就可以了,但是有的時候我們可能會遇到一些關于with的奇奇怪怪的問題,想要找出真正的原因,就要深入理解with關鍵字,這有助于我們去深入學習JS這門語言,同時也是學習JS的一個樂趣。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

理解javascript中的with關鍵字_javascript技巧

理解javascript中的with關鍵字_javascript技巧:說起js中的with關鍵字,很多小伙伴們的第一印象可能就是with關鍵字的作用在于改變作用域,然后最關鍵的一點是不推薦使用with關鍵字。聽到不推薦with關鍵字后,我們很多人都會忽略掉with關鍵字,認為不要去管它用它就可以了。但是有時候,我們在看一些代碼或者
推薦度:
標簽: js 理解 javascript
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 黄色毛片在线观看 | 伊人影院久久 | 日韩在线一区二区三区免费视频 | 国产欧美精品 | 亚洲欧洲高清 | 日韩毛片在线影视 | 人人草视频在线观看 | 日产精品一区二区三区免费 | 国产日韩一区二区三区在线观看 | 国产精品视频一区二区三区w | 在线观看日韩欧美 | xx欧美| 欧美国产亚洲一区二区三区 | 91一区二区三区四区五区 | 欧美成人精品高清在线播放 | 五十路亲子中出在线观看 | 欧美日韩黄色大片 | 成人亚洲综合 | 欧美亚洲国产日韩一区二区三区 | 国产精品久久二区三区色裕 | 97久久精品午夜一区二区 | 国产一区在线视频观看 | 99国产精品久久久久久久成人热 | 亚洲欧美在线综合 | 国产高清一区二区 | 国产在线观看入口 | 久久久久国产一级毛片高清版 | 亚洲欧美日韩国产 | 欧美日韩综合精品一区二区三区 | 福利视频欧美一区二区三区 | 国产不卡视频在线观看 | 亚洲视频免费一区 | 日韩欧美色| 国产精品美女久久久久网站 | 香蕉一区二区 | 久久久影院亚洲精品 | 日本我不卡 | 国产成人一区二区三区 | 国产精品福利一区二区久久 | 欧美天天 | 国产一区二区三区夜色 |