日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

javascript:with的用法以及延长作用域链

發(fā)布時(shí)間:2023/12/9 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript:with的用法以及延长作用域链 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:http://lllt.iteye.com/blog/1246424

?《Javascript高級(jí)程序設(shè)計(jì)(第二版)》第66頁(yè)中提到:“由于with語(yǔ)句的變量對(duì)象是只讀的,結(jié)果url就成了函數(shù)執(zhí)行環(huán)境的一部分,因而可以作為函數(shù)的值被返回。”,不知道誰(shuí)看完覺(jué)得一頭霧水?

?

? ? 首先來(lái)看看他舉的例子:

?

Js代碼?? function buildUrl(){ var qs="?debug=true"; with(location){ var url=href+qs; } return url; } var result=buildUrl(); alert(result);

  

?

? ? 如果你沒(méi)讀過(guò)著本書(shū),并且需要學(xué)習(xí)javascript,請(qǐng)思考并嘗試運(yùn)行該例子。

?

? ? 最后彈出的不是undefined,而是你的靜態(tài)頁(yè)地址+qs的值。

?

來(lái)看一下with語(yǔ)句的作用:

?

? ? 通俗的說(shuō),就是引用對(duì)象,并對(duì)該對(duì)象上的屬性進(jìn)行操作,其作用是可以省略重復(fù)書(shū)寫(xiě)該對(duì)象名稱(chēng),起到簡(jiǎn)化書(shū)寫(xiě)的作用。

?

但是有幾個(gè)問(wèn)題需要注意:

?

? ?1、with代碼塊中,javascript引擎對(duì)變量的處理方式是:先查找是不是該對(duì)象的屬性,如果是,則停止。如果不是繼續(xù)查找是不是局部變量。(在《Javascript高級(jí)程序設(shè)計(jì)(第二版)》中提到的觀(guān)點(diǎn),跟這一點(diǎn)恰好相反,但是實(shí)例可證明其是錯(cuò)誤的,會(huì)在接下來(lái)介紹)

?

? ?2、就算在with語(yǔ)句中使用 var 運(yùn)算符重新定義變量(該變量是with引用對(duì)象的屬性),如果該屬性是可寫(xiě)屬性,那么也會(huì)給對(duì)象的屬性賦值。

?

? ?3、如果你想通過(guò)with語(yǔ)句,對(duì)引用對(duì)象添加多個(gè)屬性,并為每個(gè)屬性賦值,這是不可能的!也就是說(shuō),要賦值的只能是對(duì)象已經(jīng)存在并且可以寫(xiě)入的屬性(不能是只讀屬性)。

?

再來(lái)看看開(kāi)頭提到的那句話(huà)

?

? ? “由于with語(yǔ)句的變量對(duì)象是只讀的,結(jié)果url就成了函數(shù)執(zhí)行環(huán)境的一部分,因而可以作為函數(shù)的值被返回。”

?

? ? 反過(guò)來(lái):如果with語(yǔ)句的變量對(duì)象是可寫(xiě)入的…… 剛才第3點(diǎn)提過(guò),不能給對(duì)象寫(xiě)入原來(lái)不存在的屬性,先這樣理解,下面還有另外的含義。

?

那延長(zhǎng)作用域鏈又是怎么回事?

?

? ?一般的,“由于with語(yǔ)句塊中作用域的‘變量對(duì)象’是只讀的,所以在他本層定義的標(biāo)識(shí)符,不能存儲(chǔ)到本層,而是存儲(chǔ)到它的上一層作用域”。這里又要理解有一層“只讀”的含義。

?

? ?在Javascript的作用域中(作用域,想想就是函數(shù)塊,每個(gè)函數(shù)都會(huì)有個(gè)函數(shù)名,就算是匿名函數(shù)也有個(gè)空函數(shù)名),那么創(chuàng)建作用域的時(shí)候,本層的標(biāo)識(shí)符就可以寄托在這個(gè)作用域下,而with語(yǔ)句塊中作用域的‘變量對(duì)象’是只讀的,不能存儲(chǔ)標(biāo)識(shí)符,只能存儲(chǔ)在其上一層,這就是延長(zhǎng)作用域鏈。其實(shí),這和上面說(shuō)的不能給對(duì)象添加屬性有同工之處。

?

? ?其實(shí),完全可以這樣理解,在Javascript中,沒(méi)有塊級(jí)作用域,就是說(shuō)除了函數(shù),其他的塊級(jí)代碼都沒(méi)有自己的作用域。

?

現(xiàn)在說(shuō)一下之前提到的with代碼塊中變量處理方式的問(wèn)題

?

? ?用事實(shí)說(shuō)話(huà):

?

Js代碼?? var o={href:"sssss"}; var href="1111"; function buildUrl(){ var qs="?debug=true"; with(o){ href="2222"; var url=href+qs; } return url; } var result=buildUrl(); alert(result); alert(href);

?

? ? 結(jié)果:2222?debug=true ?+ ?1111

?

? ? 很明顯,with語(yǔ)句中并沒(méi)有更改變量href的值,而是更改了 o 對(duì)象的 href 屬性。

?

? ? 就是說(shuō),with中首先查找的是相關(guān)對(duì)象的屬性,如果沒(méi)有,才改變變量的值。你可以將以上例子o對(duì)象的href屬性去掉看看。

轉(zhuǎn)載于:https://www.cnblogs.com/baiyuhong/p/5380610.html

總結(jié)

以上是生活随笔為你收集整理的javascript:with的用法以及延长作用域链的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。