javascript
javascript:with的用法以及延长作用域链
轉(zhuǎn)自:http://lllt.iteye.com/blog/1246424
?《Javascript高級程序設(shè)計(第二版)》第66頁中提到:“由于with語句的變量對象是只讀的,結(jié)果url就成了函數(shù)執(zhí)行環(huán)境的一部分,因而可以作為函數(shù)的值被返回。”,不知道誰看完覺得一頭霧水?
?
? ? 首先來看看他舉的例子:
?
Js代碼?? function buildUrl(){ var qs="?debug=true"; with(location){ var url=href+qs; } return url; } var result=buildUrl(); alert(result);
?
? ? 如果你沒讀過著本書,并且需要學(xué)習(xí)javascript,請思考并嘗試運行該例子。
?
? ? 最后彈出的不是undefined,而是你的靜態(tài)頁地址+qs的值。
?
來看一下with語句的作用:
?
? ? 通俗的說,就是引用對象,并對該對象上的屬性進行操作,其作用是可以省略重復(fù)書寫該對象名稱,起到簡化書寫的作用。
?
但是有幾個問題需要注意:
?
? ?1、with代碼塊中,javascript引擎對變量的處理方式是:先查找是不是該對象的屬性,如果是,則停止。如果不是繼續(xù)查找是不是局部變量。(在《Javascript高級程序設(shè)計(第二版)》中提到的觀點,跟這一點恰好相反,但是實例可證明其是錯誤的,會在接下來介紹)
?
? ?2、就算在with語句中使用 var 運算符重新定義變量(該變量是with引用對象的屬性),如果該屬性是可寫屬性,那么也會給對象的屬性賦值。
?
? ?3、如果你想通過with語句,對引用對象添加多個屬性,并為每個屬性賦值,這是不可能的!也就是說,要賦值的只能是對象已經(jīng)存在并且可以寫入的屬性(不能是只讀屬性)。
?
再來看看開頭提到的那句話
?
? ? “由于with語句的變量對象是只讀的,結(jié)果url就成了函數(shù)執(zhí)行環(huán)境的一部分,因而可以作為函數(shù)的值被返回。”
?
? ? 反過來:如果with語句的變量對象是可寫入的…… 剛才第3點提過,不能給對象寫入原來不存在的屬性,先這樣理解,下面還有另外的含義。
?
那延長作用域鏈又是怎么回事?
?
? ?一般的,“由于with語句塊中作用域的‘變量對象’是只讀的,所以在他本層定義的標識符,不能存儲到本層,而是存儲到它的上一層作用域”。這里又要理解有一層“只讀”的含義。
?
? ?在Javascript的作用域中(作用域,想想就是函數(shù)塊,每個函數(shù)都會有個函數(shù)名,就算是匿名函數(shù)也有個空函數(shù)名),那么創(chuàng)建作用域的時候,本層的標識符就可以寄托在這個作用域下,而with語句塊中作用域的‘變量對象’是只讀的,不能存儲標識符,只能存儲在其上一層,這就是延長作用域鏈。其實,這和上面說的不能給對象添加屬性有同工之處。
?
? ?其實,完全可以這樣理解,在Javascript中,沒有塊級作用域,就是說除了函數(shù),其他的塊級代碼都沒有自己的作用域。
?
現(xiàn)在說一下之前提到的with代碼塊中變量處理方式的問題
?
? ?用事實說話:
?
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語句中并沒有更改變量href的值,而是更改了 o 對象的 href 屬性。
?
? ? 就是說,with中首先查找的是相關(guān)對象的屬性,如果沒有,才改變變量的值。你可以將以上例子o對象的href屬性去掉看看。
轉(zhuǎn)載于:https://www.cnblogs.com/baiyuhong/p/5380610.html
總結(jié)
以上是生活随笔為你收集整理的javascript:with的用法以及延长作用域链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于c++跟java区别的几个总结
- 下一篇: 最新!2022 LaTeX安装教程(Wi