javascript
javascript:with的用法以及延长作用域链
轉(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)題。
- 上一篇: 关于c++跟java区别的几个总结
- 下一篇: gradle idea java ssm