亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

Javascript中的with關鍵字

2024-04-27 15:08:38
字體:
來源:轉載
供稿:網友

鏈接    http://luopq.com/2016/02/14/js-with-keyWord/

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

基本說明

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

1
with (exPRession) statement;

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

123
var qs = location.search.substring(1);var hostName = location.hostname;var url = location.href;

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

12345
with (location){    var qs = search.substring(1);    var hostName = hostname;    var url = href;}

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

with關鍵字的弊端

前面的基本說明中,我們可以看到with的作用之一是簡化代碼。但是為什么不推薦使用呢?下面我們來說說with的缺點:1、性能問題2、語義不明,調試困難

性能問題

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

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

1234567891011
function func() {    console.time("func");    var obj = {        a: [1, 2, 3]    };    for (var i = 0; i < 100000; i++) {        var v = obj.a[0];    }    console.timeEnd("func");//0.847ms}func();

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

123456789101112131415
function funcWith() {    console.time("funcWith");    var obj = {        a: [1, 2, 3]    };    var obj2 = { x: 2 };    with (obj2) {        console.log(x);        for (var i = 0; i < 100000; i++) {            var v = obj.a[0];        }    }    console.timeEnd("funcWith");//84.808ms}funcWith();

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

12345678910111213
function funcWith() {    console.time("funcWith");    var obj = {        a: [1, 2, 3]    };    with (obj) {        for (var i = 0; i < 100000; i++) {            var v = a[0];        }    }    console.timeEnd("funcWith");//88.260ms}funcWith();

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

語義不明,難以調試

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

12345678910111213141516171819
function foo(obj) {    with (obj) {        a = 2;    }}var o1 = {    a: 3};var o2 = {    b: 3};foo(o1);console.log(o1.a); // 2foo(o2);console.log( o2.a ); // undefinedconsole.log( a ); // 2

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

延伸分析

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

12345678910111213
var obj = {    x: 10,    foo: function () {        with (this) {            var x = 20;            var y = 30;            console.log(y);//30        }    }};obj.foo();console.log(obj.x);//20console.log(obj.y);//undefined

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

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

123456789101112131415
var obj = {    x: 10,    foo: function () {        var x;//聲明局部變量x        var y;//聲明局部變量y        with (obj) {            x = 20;//訪問變量x,在obj上找到x,則修改為20            y = 30;//訪問變量y,在obj上找不到y,則進一步查找,找到局部變量y,修改為30            console.log(y);//30//直接輸出局部變量y,        }    }};obj.foo();console.log(obj.x);//20,obj.x已被修改為20console.log(obj.y);//undefined,obj不存在y屬性,則為undefined

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

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

123456789101112131415
({x: 10,foo: function () {    function bar() {        console.log(x);        console.log(y);        console.log(this.x);    }    with (this) {        var x = 20;        var y = 30;        bar.call(this);    }}}).foo();

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

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久九九九九| 欧美黑人巨大xxx极品| 国产在线观看一区二区三区| 国产精品电影久久久久电影网| 欧美日韩一区二区在线| 久久精品在线视频| 久久精品国产v日韩v亚洲| 欧美丝袜美女中出在线| 亚洲国产高清福利视频| 日韩av不卡在线| 亚洲色图在线观看| 日韩av在线免费观看| 欧美一级大胆视频| 精品国产自在精品国产浪潮| 国产午夜精品美女视频明星a级| 国产精品久久电影观看| 亚洲成人性视频| 亚洲欧美日韩中文在线制服| 精品久久久香蕉免费精品视频| 国产精品你懂得| 国产成人精品视| 伊人亚洲福利一区二区三区| 国产玖玖精品视频| 国产999视频| 深夜福利91大全| 中文国产亚洲喷潮| 欧美激情在线观看视频| 欧美天天综合色影久久精品| 亚洲国模精品一区| 国产剧情久久久久久| 欧美日韩亚洲视频一区| 亚洲国产精品高清久久久| 国产精品欧美日韩| 国产精品福利网站| 91久久精品国产91久久| 亚洲视频在线观看视频| 亚洲深夜福利在线| 国产精品爱啪在线线免费观看| 精品国产乱码久久久久久婷婷| 福利一区福利二区微拍刺激| 亚洲日本中文字幕免费在线不卡| 国产精品黄页免费高清在线观看| 日韩在线资源网| 亚洲精品狠狠操| 91精品在线国产| 日韩电影在线观看免费| 深夜福利91大全| 欧美乱大交xxxxx| 亚洲最大成人在线| 日韩av色综合| 久久久久久久久久久免费| 精品女同一区二区三区在线播放| 亚洲精品白浆高清久久久久久| 国产成人av在线| 日韩av日韩在线观看| 久久精品欧美视频| 91在线无精精品一区二区| 亚洲精品福利在线观看| 亚洲欧美中文日韩v在线观看| 国产一区二区三区三区在线观看| 97视频在线播放| 欧美性猛xxx| 上原亚衣av一区二区三区| 中文字幕成人在线| 国产精品久久久久久久久久尿| 亚洲成人黄色在线观看| 久久国产精品视频| 中文字幕日韩欧美精品在线观看| 日韩久久午夜影院| 狠狠躁夜夜躁久久躁别揉| 亚洲国产女人aaa毛片在线| 亚洲成人av资源网| 亚洲成人精品久久久| 欧美电影免费播放| 欧美激情a在线| 亚洲免费视频在线观看| 国模叶桐国产精品一区| 日韩男女性生活视频| 亚洲图片欧洲图片av| 久久精品视频一| 欧美性xxxxxxx| 91在线免费看网站| 欧美一级大片视频| 久久久久久亚洲精品不卡| 538国产精品一区二区在线| 岛国av在线不卡| 高清一区二区三区日本久| 欧美成人激情在线| 热久久99这里有精品| 日韩精品视频免费专区在线播放| 一个人看的www欧美| 狠狠色狠狠色综合日日五| 亚洲天堂av网| 日本19禁啪啪免费观看www| 久久久久久美女| 九九久久久久久久久激情| 欧美久久精品午夜青青大伊人| yw.139尤物在线精品视频| 日本高清不卡在线| 国产日韩欧美视频| 欧美极品美女电影一区| 欧美制服第一页| 欧美孕妇性xx| 欧美精品一二区| 日本精品久久久久影院| 亚洲精品日韩丝袜精品| 欧美理论电影网| 精品免费在线观看| 久久久精品国产一区二区| 亚洲一区二区久久久久久久| 欧美成人中文字幕| 91久久嫩草影院一区二区| 日韩精品免费在线视频观看| 国产精品专区h在线观看| 亚洲福利视频久久| 国产一区二区三区在线| 亚洲成人精品在线| 亚洲网站在线看| 国产精品www色诱视频| 91高潮在线观看| 亚洲成色777777在线观看影院| 欧亚精品在线观看| 国产精品国产亚洲伊人久久| 国产啪精品视频| 亚洲国产精品99| 国产精品久久久久久搜索| 中国china体内裑精亚洲片| 欧美精品videossex性护士| 日本中文字幕久久看| 亚洲成人精品视频在线观看| 九九精品在线视频| 欧美日韩日本国产| 亚洲国产精彩中文乱码av在线播放| 久99久在线视频| 亚洲天堂av高清| 亚洲国产美女久久久久| 国产精品久久电影观看| 国产一级揄自揄精品视频| 亚洲国产高潮在线观看| 日韩中文字幕免费视频| 欧美精品电影免费在线观看| 国内精品免费午夜毛片| 国产精品视频免费在线| 欧美成年人视频| 日韩精品极品视频免费观看| 亚洲精品国产成人| 成人国产精品色哟哟| 久久精品在线播放| 在线日韩欧美视频| 亚洲最大福利视频网| 亚洲国产精品推荐| 欧美大胆a视频| 久久精品视频免费播放| 一色桃子一区二区| 日韩成人在线免费观看| 日韩在线资源网| 色噜噜久久综合伊人一本| 亚洲欧美制服综合另类| 国产精品视频永久免费播放| 97色在线播放视频| 福利二区91精品bt7086| 亚洲精品国产综合区久久久久久久| 亚洲欧美日韩在线一区| 亚洲国产中文字幕久久网|